Lambda 함수에 AWS 서비스 접근 권한 부여하기
Lambda 함수에 AWS 서비스 접근 권한 부여하기 (Granting Lambda function access to AWS services)
AWS 서비스로 함수를 호출할 때 리소스 기반 정책(resource-based policy)의 문(statement)에서 권한을 부여해요. 함수 전체에 문을 적용하거나, 단일 버전이나 별칭으로 제한할 수 있어요.
참고 Lambda 콘솔로 함수에 트리거를 추가하면 콘솔이 함수의 리소스 기반 정책을 업데이트해 서비스가 함수를 호출하도록 허용해요. Lambda 콘솔에서 사용할 수 없는 다른 계정이나 서비스에 권한을 부여하려면 AWS CLI를 사용할 수 있어요.
전체 JSON 정책을 정의하려면 put-resource-policy 사용을 권장해요. put-resource-policy로 deny 문을 추가하고, 전체 범위의 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으로 개별 문을 추가할 수 있어요. 다음 명령은 Amazon Simple Notification Service에 my-function이라는 함수를 호출할 권한을 부여해요.
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"}
참고
put-resource-policy후에add-permission을 호출하면 새 문이 기존 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의 경우 계정 ID와 함께 source-account 옵션을 사용해요.
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-account 123456789012