Lambda 함수를 사용하여 다른 AWS 계정의 Amazon S3 버킷에 파일을 업로드할 때 액세스 거부 오류가 발생하는 이유는 무엇입니까?

3분 분량
0

AWS Lambda 함수를 사용하여 Amazon Simple Storage Service(S3) 버킷에 파일을 업로드할 때 액세스 거부 오류가 발생합니다. Amazon S3 버킷은 다른 AWS 계정에 있습니다. 

간략한 설명

Lambda 함수와 Amazon S3 버킷 간의 권한이 불완전하거나 잘못된 경우 Lambda는 액세스 거부 오류를 반환합니다.

한 계정(계정 1)의 Lambda 함수와 다른 계정(계정 2)의 S3 버킷 간에 권한을 설정하려면 다음을 수행하십시오.

1.    (계정 1에서) Lambda 함수가 Amazon S3에 객체를 업로드할 수 있도록 하는 Lambda 실행 역할을 생성합니다.

2.    (계정 2에서) Lambda 함수가 버킷에 객체를 업로드할 수 있도록 S3 버킷의 버킷 정책을 수정합니다.

해결 방법

중요: 다음 해결 방법을 사용하려면 한 AWS 계정에는 Lambda 함수가 필요하고 다른 계정에는 S3 버킷이 있어야 합니다.

S3 버킷에 파일을 업로드하는 Lambda 함수의 예제 코드(Python 버전 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

참고: 업로드 요청에서 버킷 소유자 전체 제어 ACL을 전달하기 전에 버킷에서 ACL이 비활성화되지 않았는지 확인하십시오. S3 버킷의 소유권 설정에서 이 작업을 수행합니다. 자세한 내용은 객체 소유권 제어 및 버킷의 ACL 비활성화를 참조하십시오.

(계정 1에서) Lambda 함수가 Amazon S3에 객체를 업로드할 수 있도록 하는 Lambda 실행 역할을 생성합니다.

1.    Lambda 함수에 대한 AWS ID 및 액세스 관리(IAM) 역할을 생성합니다.

2.    IAM 역할의 Amazon 리소스 이름(ARN)을 복사합니다.

참고: S3 버킷의 버킷 정책을 업데이트하려면 먼저 IAM 역할의 ARN을 가져와야 합니다. IAM 역할의 ARN을 가져오는 한 가지 방법은 AWS Command Line Interface(AWS CLI) get-role 명령을 실행하는 것입니다. AWS CLI 명령을 실행할 때 오류가 발생하면 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

3.    계정 2의 버킷에 객체(s3:PutObject)를 업로드할 권한을 부여하는 정책을 IAM 역할에 연결합니다.

IAM 역할에 s3:PutObject 및 s3:PutObjectACL 권한을 부여하는 예제 IAM 정책

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

4.    Lambda 함수의 실행 역할을 생성한 IAM 역할로 변경합니다. 지침에 대해서는 Lambda 함수 옵션 구성을 참조하십시오.

(계정 2에서) Lambda 함수가 버킷에 객체를 업로드할 수 있도록 S3 버킷의 버킷 정책을 수정합니다.

Lambda 실행 역할의 ARN을 s3:PutObject 작업에 액세스할 수 있는 보안 주체로 지정하도록 버킷 정책을 업데이트합니다.

Lambda 함수가 버킷에 객체를 업로드하도록 허용하는 예제 S3 버킷 정책

참고: 또한 다음 정책은 Lambda 함수의 실행 역할에 s3:PutObjectACL에 대한 권한을 부여합니다.

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

관련 정보

Amazon S3의 403 액세스 거부 오류 문제를 해결하려면 어떻게 해야 합니까?

AWS 공식
AWS 공식업데이트됨 일 년 전