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

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Lambda에 리소스 기반 정책 사용

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

Lambda 함수의 경우 함수를 호출하거나 관리하기 위한 권한을 계정에 부여할 수 있습니다. 또한 단일 리소스 기반 정책을 사용하여 AWS Organizations의 전체 조직에 사용 권한을 부여할 수 있습니다. 계정에서의 활동에 대한 응답으로 함수를 호출하는 AWS 서비스에 호출 권한을 부여하도록 리소스 기반 정책을 사용할 수도 있습니다.

함수의 리소스 기반 정책을 보려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 구성(Configuration)을 선택한 다음 권한(Permissions)을 선택합니다.

  4. 리소스 기반 정책(Resource-based policy)까지 아래로 스크롤한 다음 정책 문서 보기(View policy document)를 선택합니다. 리소스 기반 정책에는 다른 계정 또는 AWS 서비스가 해당 함수에 액세스하려고 할 때 적용되는 권한이 표시됩니다. 다음 예제에서는 Amazon S3가 123456789012 계정에서 my-bucket 버킷의 my-function이라는 함수를 호출할 수 있도록 허용하는 명령문을 보여 줍니다.

    예 리소스 기반 정책
    { "Version": "2012-10-17", "Id": "default", "Statement": [ { "Sid": "lambda-allow-s3-my-function", "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" } } } ] }

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

참고

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

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

지원되는 API 작업

다음 Lambda 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가 함수에 대해 lambda:Invoke API를 호출하지만, 호출을 트리거하는 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가 포함되지 않은 버킷입니다. 버킷을 삭제하고, 다른 계정에서 동일한 이름으로 버킷을 생성할 수 있습니다. 계정의 리소스만 함수를 호출할 수 있게 하려면 계정 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:::my-bucket-123456 --source-account 123456789012

조직에 함수 액세스 권한 부여

AWS Organizations의 조직에 권한을 부여하려면 조직 ID를 principal-org-id로 지정합니다. 다음 AddPermission AWS CLI 명령은 조직 o-a1b2c3d4e5f의 모든 사용자에게 호출 액세스 권한을 부여합니다.

aws lambda add-permission --function-name example \ --statement-id PrincipalOrgIDExample --action lambda:InvokeFunction \ --principal * --principal-org-id o-a1b2c3d4e5f
참고

이 명령에서 Principal*입니다. 즉, o-a1b2c3d4e5f 조직의 모든 사용자에게 함수 호출 권한이 부여됩니다. AWS 계정 또는 역할을 Principal로 지정하면 해당 보안 주체만 함수 호출 권한을 얻게 됩니다. 단, 보안 주체가 o-a1b2c3d4e5f 조직에도 속하는 경우에만 그렇습니다.

이 명령은 다음과 같은 리소스 기반 정책을 생성합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "PrincipalOrgIDExample", "Effect": "Allow", "Principal": "*", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-west-2:123456789012:function:example", "Condition": { "StringEquals": { "aws:PrincipalOrgID": "o-a1b2c3d4e5f" } } } ] }

자세한 내용은 사용 설명서의 aws: PrincipalOrg ID를 참조하십시오. AWS Identity and Access Management

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

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

aws lambda add-permission --function-name my-function:prod --statement-id xaccount --action lambda:InvokeFunction \ --principal 111122223333 --output text

다음 결과가 표시됩니다:

{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:InvokeFunction","Resource":"arn:aws:lambda:us-east-2:123456789012:function:my-function"}

리소스 기반 정책은 다른 계정에서 함수에 액세스할 수 있는 권한을 부여하지만, 해당 계정의 사용자가 권한을 초과하도록 허용하지 않습니다. 다른 계정의 사용자는 Lambda API를 사용할 수 있는 해당 사용자 권한이 있어야 합니다.

사용자 또는 다른 계정의 역할에 대한 액세스 제한을 위해서는 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:*를 사용하여 특정 함수에 대한 모든 작업에 대한 액세스를 부여합니다.

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

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

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

다음 예시에서는 111122223333 계정에 bash-runtime 계층의 버전 2에 대한 액세스 권한을 부여합니다.

aws lambda add-layer-version-permission --layer-name bash-runtime --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text

다음과 유사한 출력 화면이 표시되어야 합니다.

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}

권한은 하나의 계층 버전에만 적용됩니다. 새 계층 버전을 만들 때마다 해당 과정을 반복합니다.

조직 내 모든 계정에 권한을 부여하려면 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 명령을 사용합니다.

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

정책에서 명령문을 제거하려면 remove-layer-version-permission을 사용합니다.

aws lambda remove-layer-version-permission --layer-name my-layer --version-number 3 --statement-id engineering-org