bugfix> amazon-web-services > 投稿

VPCにLambda関数があり、S3バケットにアクセスしたい。

S3 VPCエンドポイントを正しく設定したと思いますが、

同じサブネット(Lambda関数サブネット)にEC2インスタンスを作成したため、

同じセキュリティグループを使用し、

Lambda関数コードのコピーを実行し、

S3ファイルの内容を正しく表示できます。

しかし、Lambdaでコードを実行すると、失敗しました。

だから、知りたい「EC2で実行」と「ラムダで実行」の違いは何ですか?

Lambdaで実行すると失敗したのはなぜですか?

Lambda関数コードは次のとおりです。

import boto3
s3 = boto3.client('s3', region_name='ap-northeast-1')
def lambda_handler(event, context):
    bucket = '*xxxxxx*'
    key = 's3-upload.json'
    try:
        response = s3.get_object(Bucket=bucket, Key=key)
        print('--------------------------------------')
        print(response)
        print('--------------------------------------')
        body = response['Body'].read()
        print(body)
        print('--------------------------------------')
        print("CONTENT TYPE: " + response['ContentType'])
    except Exception as e:
        print('Error getting object.')
        print(e)
        raise e

回答 3 件
  • AWS LambdaがAmazon S3にアクセスできるようにする場合は、次のいずれかの方法を使用します。

    関数をVPCに関連付けないでください。アクセスは自動的に行われます。

    関数がVPCのパブリックサブネットに接続されている場合、エラスティックIP VPCに表示されるLambda関数のENIへ

    関数がVPCのプライベートサブネットに接続されている場合は、NATゲートウェイ パブリックサブネット内でルートテーブルを更新します。トラフィックは、NATゲートウェイを介してインターネットに流れます。

    を追加Amazon S3 VPCエンドポイント VPCでルートテーブルを更新します。インターネットゲートウェイではなく、トラフィックがトラフィックを通過します。

  • EC2とLambdaは同じVPC内にありますが、AWS内ではまだ異なる環境です。一方ではなくもう一方ではコードを実行できるということは、コードが正常で動作していることを意味するため、AWSの設定の問題である可能性があります。

    ラムダが使用しているサービス/実行ロールを確認しましたか?

    使用しているIAMロールに正しいレベルのS3アクセスが許可されていることを確認する必要があります。

    ラムダの実行ロールに関するこのドキュメントは、役に立つ出発点を提供する場合があります:https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role

    このようなIAMポリシーは、使用するすべての実行ロールに、すべてのS3バケットへの読み取り専用アクセスを付与します。これは、AWS管理ポリシーの1つです。

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "*"
        }
    ]
    
    

    }

  • みんな、ありがとう!その理由を見つけました。

    Lambdaには2つのサブネットprivate_sn_1とprivate_sn_2があり、

    private_sn_1はvpcエンドポイントルートテーブルを正しく設定しました。

    しかし、private_sn_2が間違ったルートテーブルを設定したため、

    そして、私のec2はprivate_sn_1で作成され、vpcエンドポイントにアクセスできます。

    通常、Lambdaはprivate_sn_1またはprivate_sn_2でランダムに実行されますが、

    しかし、私の場合は常にprivate_sn_2で実行されます(理由はわかりません)、

    したがって、private_sn_2ルートテーブルを修正したとき、

    すべてが正しい。

あなたの答え