

# Lambda에서 리소스 기반 IAM 정책 보기
<a name="access-control-resource-based"></a>

Lambda는 Lambda 함수 및 계층에 대해 리소스 기반 권한 정책을 지원합니다. 리소스 기반 정책을 사용하여 다른 [AWS 계정](permissions-function-cross-account.md), [조직](permissions-function-organization.md) 또는 [서비스](permissions-function-services.md)에 대한 액세스 권한을 부여할 수 있습니다. 리소스 기반 정책은 한 버전의 함수, 버전, 별칭 또는 계층에 적용됩니다.

------
#### [ Console ]

**함수의 리소스 기반 정책을 보려면**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수를 선택합니다.

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

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

   ```
   {
       "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:::amzn-s3-demo-bucket"
                 }
               }
           }
        ]
   }
   ```

------
#### [ AWS CLI ]

함수의 리소스 기반 정책을 보려면 `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*"}}}]}
```

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

```
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
```

------

## 지원되는 API 작업
<a name="permissions-resource-api"></a>

다음 Lambda API 작업은 리소스 기반 정책을 지원합니다.
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [DeleteAlias](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteAlias.html)
+ [DeleteFunction](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunction.html)
+ [DeleteFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionConcurrency.html)
+ [DeleteFunctionEvent간접 호출Config](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionEventInvokeConfig.html)
+ [DeleteProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteProvisionedConcurrencyConfig.html)
+ [GetAlias](https://docs.aws.amazon.com/lambda/latest/api/API_GetAlias.html)
+ [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)
+ [GetFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConcurrency.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [GetFunctionEvent간접 호출Config](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionEventInvokeConfig.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)
+ [GetProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetProvisionedConcurrencyConfig.html)
+ [간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [InvokeFunctionUrl](urls-auth.md)(권한만 해당)
+ [ListAliases](https://docs.aws.amazon.com/lambda/latest/api/API_ListAliases.html)
+ [ListFunctionEvent간접 호출Configs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionEventInvokeConfigs.html)
+ [ListProvisionedConcurrencyConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListProvisionedConcurrencyConfigs.html)
+ [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)
+ [ListVersionsByFunction](https://docs.aws.amazon.com/lambda/latest/api/API_ListVersionsByFunction.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
+ [PutFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionConcurrency.html)
+ [PutFunctionEvent간접 호출Config](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html)
+ [PutProvisionedConcurrencyConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutProvisionedConcurrencyConfig.html)
+ [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)
+ [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionEvent간접 호출Config](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionEventInvokeConfig.html)

# AWS 서비스에 대한 액세스 권한을 Lambda 함수에 부여
<a name="permissions-function-services"></a>

[AWS 서비스를 사용해 함수를 간접 호출](lambda-services.md)하는 경우 리소스 기반 정책의 문에서 권한을 부여하십시오. 전체 함수에 문을 적용하거나, 문을 단일 버전 또는 별칭으로 제한할 수 있습니다.

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

[add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 명령을 사용하여 문을 추가합니다. 가장 간단한 리소스 기반 정책 구문은 서비스가 함수를 간접 호출할 수 있도록 허용합니다. 다음 명령은 `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"}
```

이렇게 하면 Amazon SNS가 함수에 대한 [간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 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:::amzn-s3-demo-bucket \
  --source-account 123456789012
```

# 조직에 함수 액세스 권한 부여
<a name="permissions-function-organization"></a>

[AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)의 조직에 권한을 부여하려면 조직 ID를 `principal-org-id`로 지정합니다. 다음의 [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 명령은 `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` 조직에도 속하는 경우에만 그렇습니다.

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

------
#### [ JSON ]

****  

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

------

자세한 내용은 **IAM 사용자 설명서의 [aws:PrincipalOrgID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principalorgid) 섹션을 참조하세요.

# Lambda 함수에 다른 계정에 대한 액세스 권한 부여
<a name="permissions-function-cross-account"></a>

함수를 다른 AWS 계정와 공유하려면 함수의 [리소스 기반 정책](access-control-resource-based.md)에 교차 계정 권한 문을 추가합니다. [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) 명령을 실행하고 계정 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-1:123456789012:function:my-function"}
```

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

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

[별칭](configuration-aliases.md)은 다른 계정에서 간접 호출할 수 있는 버전을 제한합니다. 다른 계정에서 함수 ARN에 별칭을 포함시켜야 합니다.

```
aws lambda invoke \
  --function-name arn:aws:lambda:us-east-2:123456789012:function:my-function:prod out
```

다음 결과가 표시됩니다:

```
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}
```

그러면 함수 소유자는 간접 호출자가 함수를 간접 호출하는 방법을 변경할 필요없이 새 버전을 가리키도록 별칭을 업데이트할 수 있습니다. 이렇게 하면 다른 계정은 새 버전을 사용하기 위해 코드를 변경할 필요가 없으며, 별칭과 연결된 함수 버전을 간접 호출할 수 있는 권한만 갖습니다.

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

여러 함수에 대한 권한 또는 함수에서 작업을 수행하지 않는 작업에 대한 권한을 다른 계정에 부여하려면 [IAM 역할](access-control-identity-based.md)을 사용하는 것이 좋습니다.

# Lambda 계층에 다른 계정에 대한 액세스 권한 부여
<a name="permissions-layer-cross-account"></a>

계층을 다른 AWS 계정와 공유하려면 계층의 [리소스 기반 정책](access-control-resource-based.md)에 교차 계정 권한 문을 추가합니다. [add-layer-version-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-layer-version-permission.html) 명령을 실행하고 계정 ID를 `principal`로 지정합니다. 각 문에서 단일 계정, 모든 계정 또는 [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)의 조직을 대상으로 권한을 부여할 수 있습니다.

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

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

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

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

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

[AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 조직 내 모든 계정에 권한을 부여하려면 `organization-id` 옵션을 사용합니다. 다음 예제에서는 `my-layer`의 버전 3을 사용할 권한을 `o-t194hfs8cz` 조직 내 모든 계정에 부여합니다.

```
aws lambda add-layer-version-permission \
  --layer-name my-layer \
  --version-number 3 \
  --statement-id engineering-org \
  --principal '*' \
  --action lambda:GetLayerVersion \
  --organization-id o-t194hfs8cz \
  --output text
```

다음 결과가 표시됩니다.

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

여러 계정 또는 조직에 권한을 부여하려면 여러 개의 문을 추가해야 합니다.