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 액세스 거부 오류 문제를 해결하려면 어떻게 해야 합니까?