22

で構築されたデータ処理パイプラインを使用します

S3 + SNS + ラムダ

S3 はストレージ リージョンから通知を送信できないため、SNS を使用して、S3 通知を他のリージョンの Lambda に送信しました。

でコーディングされたラムダ関数

from __future__ import print_function
import boto3


def lambda_handler (event, context):
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"]
    input_file_key = event["Records"][0]["s3"]["object"]["key"]

    input_file_name = input_file_bucket+"/"+input_file_key

    s3=boto3.resource("s3")
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key)
    response = obj.get()

    return event #echo first key valuesdf

保存してテストを実行すると、次のエラーが発生しました

    {
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      20,
      "lambda_handler",
      "response = obj.get()"
    ],
    [
      "/var/runtime/boto3/resources/factory.py",
      394,
      "do_action",
      "response = action(self, *args, **kwargs)"
    ],
    [
      "/var/runtime/boto3/resources/action.py",
      77,
      "__call__",
      "response = getattr(parent.meta.client, operation_name)(**params)"
    ],
    [
      "/var/runtime/botocore/client.py",
      310,
      "_api_call",
      "return self._make_api_call(operation_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/client.py",
      395,
      "_make_api_call",
      "raise ClientError(parsed_response, operation_name)"
    ]
  ],
  "errorType": "ClientError",
  "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied"
}

ラムダロールを構成しました

full S3 access

ターゲットバケットにバケットポリシーを設定します

everyone can do anything(list, delete, etc.)

方針をうまく立てていないようです。

4

7 に答える 7

22

オムツの答えは実際に私の問題を正しく特定しましたが、解決策を提供しなかったので、そうすることにしました。

IAM でアクセス許可を設定するときに、次のようなものを作成した可能性があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test"
            ]
        }
    ]
}

残念ながら、それは正しくありません。バケット内のオブジェクトにオブジェクト権限を適用する必要があります。したがって、次のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::test/*"
            ]
        }
    ]
}

/*末尾に がある 2 番目の ARN に注意してください。

于 2018-05-19T18:20:27.137 に答える
18

同様の問題がありました。適切なポリシーをユーザーに添付することで解決しました。

IAM -> ユーザー -> ユーザー名 -> 権限 -> ポリシーのアタッチ。

また、AmazonCLI を使用して、正しいアクセス キーとシークレット アクセス キーを追加していることを確認してください。

于 2016-02-01T02:11:09.343 に答える