Lambda 함수를 사용하여 한 Amazon S3 버킷의 파일을 다른 AWS 계정으로 업로드하면 Access Denied 오류가 발생하는 이유는 무엇인가요?

최종 업데이트 날짜: 2022년 3월 28일

AWS Lambda 함수를 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷에 파일을 업로드하면 Access Denied 오류가 발생합니다. 이 Amazon S3 버킷은 다른 AWS 계정에 있습니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

Lambda 함수와 Amazon S3 버킷 간의 권한이 불완전하거나 잘못된 경우, Lambda가 Access Denied 오류를 반환합니다.

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

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

2.    (계정 2에서) S3 버킷의 버킷 정책을 수정하여 Lambda 함수가 해당 버킷에 객체를 업로드하도록 허용합니다.

해결 방법

중요: 다음 솔루션을 사용하려면 Lambda 함수는 한 AWS 계정에, 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")

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

1.    Lambda 함수에 대한 AWS Identity and Access Management(IAM) 역할을 생성합니다.

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

참고: IAM 역할의 ARN을 가져와야만 S3 버킷의 버킷 정책을 업데이트할 수 있습니다. IAM 역할의 ARN을 가져오는 방법 중 하나로 AWS Command Line Interface(AWS CLI)의 get-role 명령을 실행하는 방법이 있습니다. AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

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

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에서) S3 버킷의 버킷 정책을 수정하여 Lambda 함수가 해당 버킷에 객체를 업로드하도록 허용합니다

버킷 정책을 업데이트하여 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"
        }
      }
    }
  ]
}

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?