Lambda에서 "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied"라고 해서 빠졌다

3739 단어 람다S3AWS

개요



Lambda에서 S3의 특정 오브젝트를 다운로드하는 조작을 Python(boto3)에서 실행했지만, Access Denied라고 말해 실행할 수 없다.
실행 역할에 AmazonS3FullAccess를 부여하는 유사한 결과.

실행 내용


import json
import boto3

def lambda_handler(event, context):

    s3 = boto3.resource('s3')
    bucket = s3.Bucket('my-hoge-hoge-bucket')
    bucket.download_file('test.txt', 'fuga.txt')


Lambda에 표시되는 오류


{
  "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied",
  "errorType": "ClientError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 11, in lambda_handler\n    bucket.download_file('test.txt', 'fuga.txt')\n",
    "  File \"/var/runtime/boto3/s3/inject.py\", line 244, in bucket_download_file\n    return self.meta.client.download_file(\n",
    "  File \"/var/runtime/boto3/s3/inject.py\", line 170, in download_file\n    return transfer.download_file(\n",
    "  File \"/var/runtime/boto3/s3/transfer.py\", line 307, in download_file\n    future.result()\n",
    "  File \"/var/runtime/s3transfer/futures.py\", line 106, in result\n    return self._coordinator.result()\n",
    "  File \"/var/runtime/s3transfer/futures.py\", line 265, in result\n    raise self._exception\n",
    "  File \"/var/runtime/s3transfer/tasks.py\", line 126, in __call__\n    return self._execute_main(kwargs)\n",
    "  File \"/var/runtime/s3transfer/tasks.py\", line 150, in _execute_main\n    return_value = self._main(**kwargs)\n",
    "  File \"/var/runtime/s3transfer/download.py\", line 511, in _main\n    response = client.get_object(\n",
    "  File \"/var/runtime/botocore/client.py\", line 357, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 676, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
  ]
}

원인



KMS에 의해 기본 암호화 가 유효한 버킷의 객체를 조작하고 있었다.



해결책



KMS에서, 암호화에 사용하고 있는 키의 키 유저에게 대상이 되는 Lambda의 실행 롤을 추가한다.



의도적으로 KMS에서의 암호화를 설정하고 있다고 깨닫습니다만, aws에 의해 자동적으로 암호화되는(RDS의 스냅샷등) 경우는 좀처럼 눈치채지 않네요.

좋은 웹페이지 즐겨찾기