AWS 서비스에 대한 액세스 권한을 Lambda 함수에 부여
AWS 서비스를 사용해 함수를 간접 호출하는 경우 리소스 기반 정책의 문에서 권한을 부여하세요. 전체 함수에 문을 적용하거나, 문을 단일 버전 또는 별칭으로 제한할 수 있습니다.
참고
Lambda 콘솔을 사용하여 함수에 트리거를 추가하는 경우, 콘솔은 함수의 리소스 기반 정책을 업데이트하여 서비스가 함수를 간접 호출할 수 있도록 합니다. Lambda 콘솔에서 사용할 수 없는 다른 계정이나 서비스에 권한을 부여하기 위해 AWS CLI를 사용할 수 있습니다.
전체 JSON 정책을 정의하려면 put-resource-policy를 사용하는 것이 좋습니다. put-resource-policy를 사용하면 거부 문을 추가할 수 있고, 다양한 IAM 조건 키를 모두 사용하고, 문서 하나에서 모든 권한을 관리할 수 있습니다. add-permission를 사용해 간단한 사용 사례에서 개별 문을 추가할 수도 있습니다.
중요
put-resource-policy를 사용하면 리소스의 기존 리소스 기반 정책을 대신합니다. 리소스에 이미 add-permission으로 정의된 권한이 있는 경우, put-resource-policy가 해당 항목을 덮어씁니다. 변경 사항을 적용하기 전에 get-resource-policy를 사용해 기존 정책을 검색하세요.
전체 JSON 정책 사용(권장)
다음 정책 예시는 Amazon Simple Notification Service에 특정 주제에 국한해서만 이름이 my-function인 함수를 호출할 권한을 부여합니다. 이 정책은 특정 주제로부터의 호출을 거부하기도 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-sns-my-topic", "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:my-topic" } } }, { "Sid": "deny-sns-other-topic", "Effect": "Deny", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:us-east-2:123456789012:function:my-function", "arn:aws:lambda:us-east-2:123456789012:function:my-function:*" ], "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:sns:us-east-2:123456789012:restricted-topic" } } } ] }
정책을 이름이 policy.json인 파일에 저장하고 put-resource-policy를 사용해 적용합니다.
aws lambda put-resource-policy \ --resource-arn arn:aws:lambda:us-east-2:123456789012:function:my-function\ --policy file://policy.json
Amazon S3의 경우, 소스가 버킷이고 버킷의 ARN에 계정 ID를 포함하지 않습니다. 버킷을 삭제하고, 다른 계정에서 동일한 이름으로 버킷을 생성할 수 있습니다. 계정의 리소스만 함수를 호출할 수 있게 하려면 aws:SourceAccount 조건 키를 사용하세요.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "allow-s3", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Condition": { "StringEquals": { "aws:SourceAccount": "123456789012" }, "ArnLike": { "aws:SourceArn": "arn:aws:s3:::my-bucket" } } } ] }
add-permission 사용
간단한 사용 사례의 경우, add-permission을 사용해 개별 문을 추가할 수 있습니다. 다음 명령은 my-function이라는 함수를 간접 호출할 수 있는 권한을 Amazon Simple Notification Service에 부여합니다.
aws lambda add-permission \ --function-name my-function \ --action lambda:InvokeFunction \ --statement-id sns \ --principal sns.amazonaws.com \ --output text
다음 결과가 표시됩니다.
{"Sid":"sns","Effect":"Allow","Principal":{"Service":"sns.amazonaws.com"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}
참고
add-permission을 put-resource-policy 이후에 호출하면 새 문이 기존 JSON에 추가됩니다.
특정 리소스만으로 호출을 제한하려면 source-arn 옵션을 사용하세요.
aws lambda add-permission \ --function-name my-function \ --action lambda:InvokeFunction \ --statement-id sns-my-topic \ --principal sns.amazonaws.com \ --source-arn arn:aws:sns:us-east-2:123456789012:my-topic
Amazon S3의 경우, source-account 옵션을 계정 ID와 함께 사용합니다.
aws lambda add-permission \ --function-name my-function \ --action lambda:InvokeFunction \ --statement-id s3-account \ --principal s3.amazonaws.com \ --source-arn arn:aws:s3:::amzn-s3-demo-bucket\ --source-account123456789012