これが、AWS Lambda サービスがこのように設計された理由です。
How can I configure a Lambda function to take a role from another AWS account?に関するドキュメントによると、、別のアカウントからリソースにアクセスするには、Lambda 関数がassume_role
メソッドを呼び出して一時的な認証情報を取得する必要があります。私の質問は、なぜこれがラムダの外でできないのかということです。たとえば、RoleB を AccountB から RoleA (ラムダ関数の実行ロール) にバインドできます。
ロジックを外部に移動する利点は明らかです。ラムダの方が移植性が高くなります。
import boto3
def lambda_handler(context, event):
sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
RoleArn="arn:aws:iam::222222222222:role/role-on-source-account",
RoleSessionName="cross_acct_lambda"
)
ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
SESSION_TOKEN = acct_b['Credentials']['SessionToken']
# create service client using the assumed role credentials, e.g. S3
client = boto3.client(
's3',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
return "Hello from Lambda"
ロジックを削除すると、上記のコードは次のように簡略化できます。
import boto3
def lambda_handler(context, event):
# create service client e.g. S3
client = boto3.client(
's3'
)
return "Hello from Lambda"