AWS Lambda
개발자 가이드

AWS Lambda에서 리소스 기반 정책 사용

AWS Lambda는 Lambda 함수 및 계층에 대해 리소스 기반 권한 정책을 지원합니다. 리소스 기반 정책을 사용하여 리소스별로 다른 계정에 사용 권한을 부여할 수 있습니다. 리소스 기반 정책을 사용하여 AWS 서비스가 해당 함수를 호출할 수 있도록 허용할 수도 있습니다.

Lambda 함수의 경우 함수를 호출하거나 관리하기 위한 권한을 계정에 부여할 수 있습니다. 다중 구문을 추가하여 여러 계정에 액세스를 부여하거나, 함수를 호출하는 계정에 액세스를 부여할 수 있습니다. 계정에서의 작업에 대한 응답으로 다른 AWS 서비스에서 호출하는 함수의 경우 서비스에 호출 권한을 부여하는 정책을 사용하십시오.

Lambda 계층의 경우 계층의 한 버전에 대해 리소스 기반 정책을 사용하여 다른 계정에서 해당 버전을 사용하게 할 수 있습니다. 단일 계정 또는 모든 계정에 권한을 부여하는 정책 외에도 계층에 대해 조직의 모든 계정에 권한을 부여할 수도 있습니다.

참고

AddPermissionAddLayerVersionPermission API 작업 범위 내의 Lambda 리소스에 대해서만 리소스 기반 정책을 업데이트할 수 있습니다. Lambda 리소스에 대한 정책을 JSON으로 작성할 수 없으며, 해당 작업에 대한 파라미터로 매핑되지 않는 조건은 사용할 수 없습니다.

리소스 기반 정책은 한 버전의 함수, 버전, 별칭 또는 계층에 적용됩니다. 이 정책은 하나 이상의 서비스 및 계정에 권한을 부여합니다. 여러 리소스에 대한 액세스 권한을 갖게 하거나 리소스 기반 정책이 지원하지 않는 API 작업을 사용하게 하려는 신뢰할 수 있는 계정의 경우, 교차 계정 역할을 사용할 수 있습니다.

함수에 AWS 서비스에 대한 액세스 권한 부여

AWS 서비스를 사용해 함수를 호출하는 경우 리소스 기반 정책의 문에서 권한을 부여하십시오. 함수에 구문을 적용하거나, 한 버전 또는 별칭으로 제한할 수 있습니다.

참고

Lambda 콘솔을 사용하여 함수에 트리거를 추가하는 경우, 콘솔은 함수의 리소스 기반 정책을 업데이트하여 서비스가 함수를 호출할 수 있도록 합니다. Lambda 콘솔에서 사용할 수 없는 다른 계정이나 서비스에 권한을 부여하려면 AWS CLI를 사용합니다.

add-permission 명령을 사용하여 구문을 추가합니다. 가장 간단한 리소스 기반 정책 구문은 서비스가 함수를 호출할 수 있도록 허용합니다. 다음 명령은 my-function라는 함수를 호출할 수 있는 권한을 Amazon SNS에 부여합니다.

$ 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"}

이렇게 하면 Amazon SNS가 함수를 호출하지만, 호출을 트리거하는 Amazon SNS 주제를 제한하지 않습니다. 함수를 특정 리소스에서만 호출하도록 하려면, source-arn 옵션을 사용하여 리소스의 Amazon 리소스 이름(ARN)을 지정합니다. 다음 명령은 Amazon SNS가 my-topic이라는 주제 구독에 대해서만 함수를 호출할 수 있도록 허용합니다.

$ 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

일부 서비스는 다른 계정의 함수를 호출할 수 있습니다. 해당 계정 ID를 소유하는 소스 ARN을 지정하면 문제가 되지 않습니다. 하지만 Amazon S3의 경우 소스는 ARN에 버킷의 계정 ID가 포함되지 않은 버킷입니다. 버킷을 삭제하고, 다른 계정에서 동일한 이름으로 버킷을 생성할 수 있습니다. 계정의 리소스만 함수를 호출할 수 있게 하려면 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:::my-bucket-123456 --source-account 123456789012

함수에 다른 계정에 대한 액세스 권한 부여

다른 AWS 계정에 권한을 부여하려면 계정 ID를 principal로 지정합니다. 다음 예제는 prod 별칭을 가진 my-function을 호출할 수 있는 권한을 210987654321 계정에 부여합니다.

$ aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 210987654321 --output text {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

사용자, 그룹, 다른 계정의 역할에 대한 액세스 제한을 위해서는 ID의 전체 ARN을 보안 주체로 지정합니다. 예: arn:aws:iam::123456789012:user/developer.

별칭은 다른 계정에서 호출할 수 있는 버전을 제한합니다. 다른 계정에서 함수 ARN에 별칭을 포함시켜야 합니다.

$ aws lambda invoke --function-name arn:aws:lambda:us-west-2:123456789012:function:my-function:prod out { "StatusCode": 200, "ExecutedVersion": "1" }

그런 다음 별칭을 업데이트하여 필요에 따라 새 버전을 지정할 수 있습니다. 별칭을 업데이트할 때 다른 계정은 새 버전을 사용하기 위해 코드를 변경할 필요가 없으며, 사용자가 선택한 버전을 호출할 수 있는 권한만 갖습니다.

기존 함수에서 작업을 수행하는 API 작업에 대해 교차 계정 액세스 권한을 부여할 수 있습니다. 예를 들어 계정에서 별칭 목록을 확인할 수 있게 하려면 lambda:ListAliases에 대한 액세스를 부여하고, 함수 코드를 다운로드할 수 있게 하려면 lambda:GetFunction에 대한 액세스를 부여할 수 있습니다. 각 권한을 별도로 추가하거나, lambda:*를 사용하여 특정 함수에 대한 모든 작업에 대한 액세스를 부여합니다.

여러 함수에 대한 권한 또는 함수에서 작업을 수행하지 않는 작업에 대한 권한을 다른 계정에 부여하려면 역할을 사용합니다.

계층에 다른 계정에 대한 액세스 권한 부여

다른 계정에 계층 사용 권한을 부여하려면 add-layer-version-permission 명령과 함께 해당 계층 버전의 권한 정책에 명령문을 추가하십시오. 각 명령문에서 단일 계정, 모든 계정 또는 조직을 대상으로 권한을 부여할 수 있습니다.

$ aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

권한은 단일 버전의 계층에만 적용됩니다. 새 계층 버전을 만들 때마다 해당 절차를 반복합니다.

조직 내 모든 계정에 권한을 부여하려면 organization-id 옵션을 사용합니다. 다음 예제에서는 버전 3의 계층을 사용할 권한을 조직의 모든 계정에 부여합니다.

$ aws lambda add-layer-version-permission --layer-name my-layer \ --statement-id engineering-org --version-number 3 --principal '*' \ --action lambda:GetLayerVersion --organization-id o-t194hfs8cz --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}"

모든 AWS 계정에 권한을 부여하려면 보안 주체에 대해 *를 사용하고 조직 ID는 생략하십시오. 계정 또는 조직이 다수인 경우, 여러 가지 명령문을 추가하십시오.

리소스 기반 정책 정리

함수의 리소스 기반 정책을 보려면 get-policy 명령을 사용합니다.

$ aws lambda get-policy --function-name my-function --output text {"Version":"2012-10-17","Id":"default","Statement":[{"Sid":"sns","Effect":"Allow","Principal":{"Service":"s3.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:lambda*"}}}]} 7c681fc9-b791-4e91-acdf-eb847fdaa0f0

버전 및 별칭의 경우 버전 번호나 별칭을 함수 이름에 추가합니다.

$ aws lambda get-policy --function-name my-function:PROD

함수에서 권한을 제거하려면 remove-permission을 사용합니다.

$ aws lambda remove-permission --function-name example --statement-id sns

하나의 계층에 대한 권한을 보려면 get-layer-version-policy 명령을 사용하고, 해당 정책에서 명령문을 제거하려면 remove-layer-version-permission 명령을 사용하십시오.

$ aws lambda get-layer-version-policy --layer-name my-layer --version-number 3 --output text b0cd9796-d4eb-4564-939f-de7fe0b42236 {"Sid":"engineering-org","Effect":"Allow","Principal":"*","Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:3","Condition":{"StringEquals":{"aws:PrincipalOrgID":"o-t194hfs8cz"}}}" $ aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org