Lambda in VPC から VPC Endpoint (Private Link) 経由で CloudWatch Logs の API を実行してみた。クロスアカウントで Lambda から CloudWatch Logs にアクセスする - ablog と同じものを in VPC でやってみた。ポイントは以下の通り。
- STS と CloudWatch Logs の VPC Endpoint (PrivateLink) を作成する。
- Lambda in VPC 実行用のIAMロールに以下のIAMポリシーをアタッチしたIAMロールを作成する。
- AWSLambdaVPCAccessExecutionRole(AWS管理)
- STSAssumeRole(ユーザー管理)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "STSAssumeRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "*" } ] }
- Lambda 作成時に [ネットワーク] で VPC、Subnet、Security Group を作成する。
- Lambda のコードで、STS のクライアントオブジェクト生成時に region_name と endpoint_url に実行するリージョン名とエンドポイントを指定する。
- 例えば、東京リージョンの場合は、"boto3.client('sts')" を "boto3.client('sts', region_name='ap-northeast-1', endpoint_url='https://sts.ap-northeast-1.amazonaws.com')" とする。
import boto3 def lambda_handler(context, event): print('connect to sts') sts_connection = boto3.client('sts', region_name='ap-northeast-1', endpoint_url='https://sts.ap-northeast-1.amazonaws.com') # ★ region_name と endpoint_url を指定する acct_b = sts_connection.assume_role( RoleArn="arn:aws:iam:: 123456789012:role/CWLforOtherAccountLambda", RoleSessionName="cross_acct_lambda" ) print('connected to sts') ACCESS_KEY = acct_b['Credentials']['AccessKeyId'] SECRET_KEY = acct_b['Credentials']['SecretAccessKey'] SESSION_TOKEN = acct_b['Credentials']['SessionToken'] client = boto3.client( 'logs', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, aws_session_token=SESSION_TOKEN, ) response = client.get_log_events( logGroupName='/aws-glue/crawlers', logStreamName='workshop-sh10json' ) return response
参考
実行ロールおよびユーザーアクセス許可
Lambda は、関数のアクセス許可を使用してネットワークインターフェイスを作成および管理します。VPC に接続するには、関数の実行ロールに次のアクセス許可がある必要があります。
実行ロールのアクセス権限
- ec2:CreateNetworkInterface
- ec2:DescribeNetworkInterfaces
- ec2:DeleteNetworkInterface
これらのアクセス許可は、AWSLambdaVPCAccessExecutionRole 管理ポリシーに含まれています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html