ablog

不器用で落着きのない技術者のメモ

Lambda in VPC から VPC Endpoint 経由で CloudWatch Logs の API を実行する

Lambda in VPC から VPC Endpoint (Private Link) 経由で CloudWatch Logs の API を実行してみた。クロスアカウントで Lambda から CloudWatch Logs にアクセスする - ablog と同じものを in VPC でやってみた。ポイントは以下の通り。

  • STS と CloudWatch Logs の VPC Endpoint (PrivateLink) を作成する。
    • CloudWatch Logs: com.amazonaws.ap-northeast-1.logs
    • STS: com.amazonaws.ap-northeast-1.sts
  • 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 に実行するリージョン名とエンドポイントを指定する。
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