

# AWS Lambda에서 권한 관리
<a name="lambda-permissions"></a>

AWS Lambda에서 AWS Identity and Access Management(IAM)를 사용하여 권한을 관리합니다. Lambda 함수 작업 시 고려해야 할 두 가지 주요 권한 범주가 있습니다.
+ Lambda 함수가 API 작업을 수행하고 다른 AWS 리소스에 액세스하는 데 필요한 권한입니다.
+ 다른 AWS 사용자 및 엔터티가 Lambda 함수에 액세스하는 데 필요한 권한

Lambda 함수는 종종 다른 AWS 리소스에 액세스하고 해당 리소스에 대해 다양한 API 작업을 수행해야 합니다. 예를 들어 Amazon DynamoDB 데이터베이스의 항목을 업데이트하여 이벤트에 응답하는 Lambda 함수가 있을 수 있습니다. 이 경우 데이터베이스에 액세스할 수 있는 권한과 해당 데이터베이스에 항목을 추가하거나 업데이트할 수 있는 권한이 함수에 필요합니다.

[실행 역할](lambda-intro-execution-role.md)이라는 특수 IAM 역할에서 Lambda 함수에 필요한 권한을 정의합니다. 이 역할에서는 함수가 다른 AWS 리소스에 액세스하고 이벤트 소스에서 읽는 데 필요한 모든 권한을 정의하는 정책을 연결할 수 있습니다. 모든 Lambda 함수에는 실행 역할이 있어야 합니다. Lambda 함수는 기본적으로 CloudWatch Logs에 기록되므로 실행 역할에 최소한 Amazon CloudWatch에 대한 액세스 권한이 있어야 합니다. [`AWSLambdaBasicExecutionRole` 관리형 정책](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaBasicExecutionRole.html)을 실행 역할에 연결하여 이 요구 사항을 충족할 수 있습니다.

Lambda 리소스에 액세스할 수 있는 권한을 다른 AWS 계정, 조직 및 서비스에 부여하려는 경우, 다음과 같은 몇 가지 옵션이 있습니다.
+ [ID 기반 정책](access-control-identity-based.md)을 사용하여 다른 사용자에게 Lambda 리소스에 대한 액세스 권한을 부여할 수 있습니다. 자격 증명 기반 정책은 사용자에게 직접 적용하거나, 사용자와 연결된 그룹 및 역할에 적용할 수 있습니다.
+ [리소스 기반 정책](access-control-resource-based.md)을 사용하여 다른 계정과 AWS 서비스에 Lambda 리소스를 사용할 권한을 부여할 수 있습니다. 사용자가 Lambda 리소스에 액세스하려고 하면 Lambda는 사용자의 자격 증명 기반 정책 및 리소스의 리소스 기반 정책을 모두 고려합니다. Amazon Simple Storage Service(Amazon S3) 같은 AWS 서비스가 Lambda 함수를 호출하면 Lambda는 리소스 기반 정책만 고려합니다.
+ [ABAC(속성 기반 액세스 제어)](attribute-based-access-control.md) 모델을 사용하여 Lambda 함수에 대한 액세스를 제어할 수 있습니다. ABAC를 사용하면 태그를 Lambda 함수에 연결하거나, 특정 API 요청에 전달하거나, 요청을 하는 IAM 위탁자에 연결할 수 있습니다. 함수 액세스를 제어하려면 IAM 정책의 조건 요소에 동일한 태그를 지정하세요.

AWS에서는 작업을 수행하는 데 필요한 권한([least-privilege permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege))만 부여하는 것이 모범 사례입니다. 이를 Lambda에서 구현하려면 [AWS 관리형 정책](permissions-managed-policies.md)으로 시작하는 것이 좋습니다. 이러한 관리형 정책을 그대로 사용하거나, 이를 바탕으로 보다 제한적인 정책을 직접 만드는 시작점으로 활용할 수 있습니다.

최소 권한 액세스에 대한 권한을 미세 조정할 수 있도록 Lambda는 정책에 포함할 수 있는 몇 가지 추가 조건을 제공합니다. 자세한 내용은 [정책의 리소스 및 조건 섹션 미세 조정](lambda-api-permissions-ref.md) 섹션을 참조하세요.

IAM에 대한 자세한 내용은 *[IAM 사용 설명서](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)*를 참조하세요.

# 실행 역할로 Lambda 함수 권한 정의
<a name="lambda-intro-execution-role"></a>

Lambda 함수의 실행 역할은 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 함수에 부여하는 AWS Identity and Access Management(IAM) 역할입니다. Amazon CloudWatch에 로그를 전송하고, AWS X-Ray에 추적 데이터를 업로드하는 권한을 가진 실행 역할을 만들 수 있습니다. 이 페이지에서는 Lambda 함수의 실행 역할을 생성하고 보고 관리하는 방법에 대한 정보를 제공합니다.

자신의 함수를 간접 호출하면 Lambda는 자동으로 실행 역할을 맡습니다. 함수 코드에서 실행 역할을 수임하기 위해 수동으로 `sts:AssumeRole`을 직접 호출하는 것을 피해야 합니다. 사용 사례에서 역할을 맡아야 하는 경우 자신의 역할의 신뢰 정책에, 역할 자체를 신뢰할 수 있는 보안 주체로 포함해야 합니다. 역할 신뢰 정책을 수정하는 방법에 대한 자세한 내용은 IAM 사용 설명서의 [역할 신뢰 정책 수정(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)을 참조하세요.

Lambda가 실행 역할을 제대로 수임하려면 역할의 [신뢰 정책](#permissions-executionrole-api)에서 Lambda 서비스 주체(`lambda.amazonaws.com`)를 신뢰할 수 있는 서비스로 지정해야 합니다.

**Topics**
+ [IAM 콘솔에서 실행 역할 생성](#permissions-executionrole-console)
+ [AWS CLI로 사용하여 역할 생성 및 관리](#permissions-executionrole-api)
+ [Lambda 실행 역할에 최소 권한 액세스 부여](#permissions-executionrole-least-privilege)
+ [실행 역할의 권한 보기 및 업데이트](permissions-executionrole-update.md)
+ [실행 역할에서 AWS 관리형 정책 작업](permissions-managed-policies.md)
+ [소스 함수 ARN을 사용하여 함수 액세스 동작 제어](permissions-source-function-arn.md)

## IAM 콘솔에서 실행 역할 생성
<a name="permissions-executionrole-console"></a>

기본적으로 Lambda는 [Lambda 콘솔에서 함수를 생성](getting-started.md#getting-started-create-function)할 때 최소한의 권한으로 실행 역할을 생성합니다. 특히 이 실행 역할에는 함수에 Amazon CloudWatch Logs에 이벤트를 기록할 수 있는 기본 권한을 부여하는 [`AWSLambdaBasicExecutionRole` 관리형 정책](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaBasicExecutionRole.html)이 포함되어 있습니다. **권한** 섹션에서 **기본 역할 생성**을 선택할 수 있습니다.

**권한 섹션**에서 **다른 역할 사용**을 선택하여 기존 역할을 선택할 수 있습니다. 이벤트에 대한 응답으로 Amazon DynamoDB 데이터베이스의 항목 업데이트와 같은 태스크를 수행할 추가 권한이 Lambda 함수에 필요한 경우 필요한 권한이 있는 사용자 지정 실행 역할을 생성할 수 있습니다. 이렇게 하려면 **권한** 섹션에서 **다른 역할 사용**을 선택합니다. 그러면 권한을 사용자 지정할 수 있는 드로어가 열립니다.

**콘솔에서 실행 역할을 구성하는 방법**

1. 역할 세부 정보 섹션에서 **역할 이**름을 입력합니다.

1. **정책** 섹션에서 **기존 정책 사용**을 선택합니다.

1. 역할에 연결할 AWS 관리형 정책을 선택합니다. 예를 들어 함수가 DynamoDB에 액세스해야 하는 경우 **AWSLambdaDynamoDBExecutionRole** 관리형 정책을 선택하세요.

1. **역할 생성**을 선택합니다.

또는 [Lambda 콘솔에서 함수를 생성](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)할 때 이전에 생성한 모든 실행 역할을 함수에 연결할 수 있습니다. 기존 함수에 새 실행 역할을 연결하려면 [함수의 실행 역할 업데이트](permissions-executionrole-update.md)의 단계를 따르세요.

## AWS CLI로 사용하여 역할 생성 및 관리
<a name="permissions-executionrole-api"></a>

AWS Command Line Interface(AWS CLI)를 사용하여 실행 역할을 생성하려면 **create-role** 명령을 사용합니다. 이 명령을 사용할 때는 신뢰 정책 인라인을 지정할 수 있습니다. 역할의 신뢰 정책은 지정된 보안 주체에게 역할을 맡을 수 있는 권한을 부여합니다. 다음 예에서는 Lambda 서비스 보안 주체에게 자신의 역할을 맡을 권한을 부여합니다. JSON 문자열의 이스케이프 따옴표 요구 사항은 셸에 따라 다릅니다.

```
aws iam create-role \
  --role-name lambda-ex \
  --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
```

별도의 JSON 파일을 사용하여 역할에 대한 신뢰 정책을 정의할 수도 있습니다. 다음 예제에서 `trust-policy.json`은 최신 디렉터리의 파일입니다.

**Example trust-policy.json**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

```
aws iam create-role \
  --role-name lambda-ex \
  --assume-role-policy-document file://trust-policy.json
```

역할에 권한을 추가하려면 **attach-policy-to-role** 명령을 사용하세요. 다음 명령은 `AWSLambdaBasicExecutionRole` 관리형 정책을 `lambda-ex` 실행 역할에 추가합니다.

```
aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

실행 역할을 생성한 후 함수에 연결합니다. [Lambda 콘솔에서 함수를 생성](getting-started.md#getting-started-create-function)할 때 이전에 생성한 모든 실행 역할을 함수에 연결할 수 있습니다. 기존 함수에 새 실행 역할을 연결하려면 [함수의 실행 역할 업데이트](permissions-executionrole-update.md#update-execution-role)의 단계를 따르세요.

## Lambda 실행 역할에 최소 권한 액세스 부여
<a name="permissions-executionrole-least-privilege"></a>

개발 단계 중에 Lambda에 대한 IAM 역할을 처음 생성하는 경우 간혹 필요 이상의 권한을 부여하게 될 수 있습니다. 모범 사례로 프로덕션 환경에 함수를 게시하기 전에 필요한 권한만 포함하도록 정책을 조정하는 것이 가장 좋습니다. 자세한 정보는 *IAM 사용 설명서*의 [최소 권한 적용](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)을 참조하세요.

IAM Access Analyzer를 사용하면 IAM 실행 역할 정책에 필요한 권한을 식별하는 데 도움이 될 수 있습니다. IAM Access Analyzer는 지정한 날짜 범위에 걸친 AWS CloudTrail 로그를 검토하여 해당 기간 동안 함수가 사용했던 권한만을 포함한 정책 템플릿을 생성합니다. 템플릿을 사용하여 세분화된 권한을 가진 관리형 정책을 생성한 다음 IAM 역할에 연결할 수 있습니다. 이렇게 하면 특정 사용 사례에 따라 역할이 AWS 리소스와 상호 작용하는 데 필요한 권한만 부여할 수 있습니다.

자세한 내용은 *IAM 사용 설명서*에서 [액세스 활동을 기반으로 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_generate-policy.html)을 참조하세요.

# 실행 역할의 권한 보기 및 업데이트
<a name="permissions-executionrole-update"></a>

이 항목에서는 함수의 [실행 역할](lambda-intro-execution-role.md)을 보고 업데이트하는 방법을 다룹니다.

**Topics**
+ [함수의 실행 역할 보기](#view-execution-role)
+ [함수의 실행 역할 업데이트](#update-execution-role)

## 함수의 실행 역할 보기
<a name="view-execution-role"></a>

함수의 실행 역할을 보려면 Lambda 콘솔을 사용하세요.

**함수의 실행 역할을 보려면 다음을 수행하세요(콘솔).**

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

1. 함수의 이름을 선택합니다.

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

1. **실행 역할**에서 함수의 실행 역할로 현재 사용되고 있는 역할을 볼 수 있습니다. 편의를 위해 **리소스 요약** 섹션에서 함수가 액세스할 수 있는 모든 리소스와 작업을 볼 수 있습니다. 드롭다운 목록에서 서비스를 선택하여 해당 서비스와 관련된 모든 권한을 확인할 수 있습니다.

## 함수의 실행 역할 업데이트
<a name="update-execution-role"></a>

언제든지 함수의 실행 역할에서 원한을 추가하거나 제거할 수 있으며, 다른 역할에 사용하도록 함수를 구성할 수 있습니다. 함수가 다른 서비스나 리소스에 액세스해야 하는 경우 실행 역할에 필수 권한을 추가해야 합니다.

함수에 권한을 추가할 때 코드나 구성에 대한 간단한 업데이트도 수행하세요. 그러면 자격 증명이 오래된 함수의 인스턴스 실행이 중지 및 대체됩니다.

함수의 실행 역할을 업데이트하려면 Lambda 콘솔을 사용하세요.

**함수의 실행 역할을 업데이트하려면 다음을 수행하세요(콘솔).**

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

1. 함수의 이름을 선택합니다.

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

1. **실행 역할**에서 **편집**을 선택합니다.

1. 다른 역할을 실행 역할로 사용하도록 함수를 업데이트하려면 **기존 역할** 아래의 드롭다운 메뉴에서 새 역할을 선택합니다.
**참고**  
기존 실행 역할 내에서 권한을 업데이트하려는 경우 AWS Identity and Access Management(IAM) 콘솔에서만 가능합니다.

   실행 역할로 사용할 새 역할을 생성하려면 **실행 역할** 아래의 **AWS 정책 템플릿에서 새 역할 생성**을 선택합니다. 그런 다음 **역할 이름** 아래에 새 역할의 이름을 입력하고 **정책 템플릿** 아래에서 새 역할에 연결할 정책을 지정합니다.

1. **Save**(저장)를 선택합니다.

# 실행 역할에서 AWS 관리형 정책 작업
<a name="permissions-managed-policies"></a>

다음 AWS 관리형 정책은 Lambda 기능을 사용하는 데 필요한 권한을 제공합니다.


| 변경 사항 | 설명 | 날짜 | 
| --- | --- | --- | 
|  **[ AWSLambdaMSKExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole)** – Lambda에서 이 정책에 [kafka:DescribeClusterV2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html#v2-clusters-clusterarnget) 권한을 추가했습니다.  |  `AWSLambdaMSKExecutionRole`은 Amazon Managed Streaming for Apache Kafka(Amazon MSK) 클러스터에서 레코드를 읽고 액세스하고, 탄력적 네트워크 인터페이스(ENI)를 관리하고, CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 6월 17일  | 
|  **[ AWSLambdaBasicExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSLambdaBasicExecutionRole`은 CloudWatch에 로그를 업로드할 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AWSLambdaDynamoDBExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSLambdaDynamoDBExecutionRole`은 Amazon DynamoDB Stream에서 레코드를 읽고 CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AWSLambdaKinesisExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSLambdaKinesisExecutionRole`은 Amazon Kinesis 데이터 스트림에서 이벤트를 읽고 CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AWSLambdaMSKExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaMSKExecutionRole)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSLambdaMSKExecutionRole`은 Amazon Managed Streaming for Apache Kafka(Amazon MSK) 클러스터에서 레코드를 읽고 액세스하고, 탄력적 네트워크 인터페이스(ENI)를 관리하고, CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AWSLambdaSQSQueueExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSLambdaSQSQueueExecutionRole`은 Amazon Simple Queue Service(Amazon SQS) 대기열에서 메시지를 읽고 CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AWSLambdaVPCAccessExecutionRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSLambdaVPCAccessExecutionRole`은 Amazon VPC 내에서 ENI를 관리하고 CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AWSXRayDaemonWriteAccess`는 추적 데이터를 X-Ray에 업로드할 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ CloudWatchLambdaInsightsExecutionRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/CloudWatchLambdaInsightsExecutionRolePolicy)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `CloudWatchLambdaInsightsExecutionRolePolicy`는 CloudWatch Lambda Insights에 런타임 지표를 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 
|  **[ AmazonS3ObjectLambdaExecutionRolePolicy](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AmazonS3ObjectLambdaExecutionRolePolicy)** – Lambda가 이 정책의 변경 사항 추적을 시작했습니다.  |  `AmazonS3ObjectLambdaExecutionRolePolicy`는 Amazon Simple Storage Service(Amazon S3) 객체 Lambda와 상호 작용하고 CloudWatch 로그에 쓸 수 있는 권한을 부여합니다.  |  2022년 2월 14일  | 

일부 기능의 경우 Lambda 콘솔은 고객 관리형 정책의 실행 역할에 누락된 권한을 추가하려고 시도합니다. 이러한 정책은 많아질 수 있습니다. 추가 정책을 만들지 않도록 기능을 활성화하기 전에 실행 역할에 관련된 AWS 관리형 정책을 추가합니다.

[이벤트 소스 매핑](invocation-eventsourcemapping.md)을 사용하여 함수를 호출할 경우 Lambda는 실행 역할을 사용해 이벤트 데이터를 읽습니다. 예를 들어 Kinesis에 대한 이벤트 소스 매핑은 데이터 스트림의 이벤트를 읽고 이를 함수에 배치(batch)로 전송합니다.

서비스가 계정에서 역할을 맡은 경우, 역할 신뢰 정책의 `aws:SourceAccount` 및 `aws:SourceArn` 전역 조건 컨텍스트 키를 포함하여 역할에 대한 액세스를 예상 리소스에 의해 생성된 요청으로만 제한할 수 있습니다. 자세한 내용은 [AWS Security Token Service에 대한 교차 서비스 혼동된 대리자 예방](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html#cross-service-confused-deputy-prevention)을 참조하세요.

AWS 관리형 정책 외에도 Lambda 콘솔은 추가 사용 사례와 관련된 권한을 가진 사용자 지정 정책을 생성하는 템플릿을 제공합니다. Lambda 콘솔에서 함수를 생성할 때 하나 이상의 템플릿의 권한을 사용하여 새로운 실행 역할을 만들 수 있습니다. 블루프린트에서 함수를 생성하거나, 다른 서비스에 액세스해야 하는 옵션을 구성할 때 이러한 템플릿도 자동으로 적용됩니다. 예제 템플릿은 이 설명서의 [GitHub 리포지토리](https://github.com/awsdocs/aws-lambda-developer-guide/tree/master/iam-policies)에서 구할 수 있습니다.

# 소스 함수 ARN을 사용하여 함수 액세스 동작 제어
<a name="permissions-source-function-arn"></a>

Lambda 함수 코드가 다른 AWS 서비스에 API 요청을 전송하는 일은 일반적인 작업입니다. 이러한 요청을 수행하기 위해 Lambda는 함수의 실행 역할을 가정하여 휘발성 자격 증명 세트를 생성합니다. 이러한 보안 인증 정보는 함수를 호출할 때 환경 변수로 사용할 수 있습니다. AWS SDK로 작업할 때는 코드에서 직접 SDK의 보안 인증 정보를 제공할 필요가 없습니다. 기본적으로 보안 인증 공급자 체인은 사용자가 보안 인증 정보를 설정할 수 있는 각 위치를 순차적으로 확인하고, 일반적으로 환경 변수(`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` 및 `AWS_SESSION_TOKEN`)인 사용 가능한 첫 번째 위치를 선택합니다.

Lambda는 요청이 실행 환경 내에서 오는 AWS API 요청인 경우 소스 함수 ARN을 보안 인증 컨텍스트에 삽입합니다. 또한 Lambda는 실행 환경 외부에서 Lambda가 사용자를 대신하여 실행하는 다음 AWS API 요청의 소스 함수 ARN를 주입합니다.


| 서비스 | 작업 | 이유 | 
| --- | --- | --- | 
| CloudWatch Logs | CreateLogGroup, CreateLogStream, PutLogEvents |  CloudWatch Logs 로그 그룹에 로그를 저장하려면  | 
| X-Ray | PutTraceSegments |  추적 데이터를 X-Ray로 전송하려면  | 
| Amazon EFS | ClientMount |  함수를 Amazon Elastic File System(Amazon EFS) 파일 시스템에 연결하려면  | 

Lambda가 같은 실행 역할을 사용하여 사용자를 대신하여 실행 환경 외부에서 실행하는 다른 AWS API 호출은 소스 함수 ARN를 포함하지 않습니다. 실행 환경 외부에서의 해당 API 호출의 예는 다음과 같습니다.
+ AWS Key Management Service(AWS KMS)을(를) 호출하여 환경 변수를 자동으로 암호화 및 복호화합니다.
+ Amazon Elastic Compute Cloud(Amazon EC2)를 호출하여 VPC 지원 함수에 대해 탄력적 네트워크 인터페이스(ENI)를 생성합니다.
+ Amazon Simple Queue Service(Amazon SQS)와 같은 AWS 서비스에 대한 직접 호출. 이를 통해 [이벤트 소스 매핑](invocation-eventsourcemapping.md)으로 설정된 이벤트 소스에서 데이터를 읽습니다.

자격 증명 콘텍스트에서 소스 함수 ARN를 사용하여 리소스에 대한 호출이 특정 Lambda 함수의 코드에서 왔는지 여부를 확인할 수 있습니다. 이를 확인하려면 IAM ID 기반 정책 또는 [서비스 제어 정책(SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)의 `lambda:SourceFunctionArn` 조건 키를 사용하세요.

**참고**  
리소스 기반 정책의 `lambda:SourceFunctionArn` 조건 키를 사용할 수 없습니다.

자격 증명 기반 정책 또는 SCP에서 이 조건 키를 사용하여 함수 코드가 다른 AWS 서비스에 수행하는 API 작업에 대한 보안 제어를 구현할 수 있습니다. 여기에는 자격 증명 유출의 원인을 식별하는 데 도움이 되는 몇 가지 주요 보안 애플리케이션이 있습니다.

**참고**  
`lambda:SourceFunctionArn` 조건 키가 `lambda:FunctionArn` 및 `aws:SourceArn` 조건 키와 다릅니다. `lambda:FunctionArn` 조건 키는 [이벤트 소스 매핑](invocation-eventsourcemapping.md)에만 적용되고 이벤트 소스가 간접 호출할 수 있는 함수를 정의하는 데 도움이 됩니다. `aws:SourceArn` 조건 키는 Lambda 함수가 대상 리소스인 정책에만 적용되며 AWS 서비스 및 리소스가 해당 함수를 간접 호출하도록 정의하도록 돕습니다. `lambda:SourceFunctionArn` 조건 키는 모든 자격 증명 기반 정책 또는 SCP에 적용하여 다른 리소스에 대한 특정 AWS API 호출 권한을 가진 특정 Lambda 함수를 정의할 수 있습니다.

정책에서 `lambda:SourceFunctionArn`을(를) 사용하려면 [ARN 조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN) 중 하나를 포함하는 조건으로 포함하십시오. 키 값은 유효한 ARN이어야 합니다.

예를 들어, Lambda 함수 코드가 특정 Amazon S3 버킷을 대상으로 하는 `s3:PutObject` 호출을 한다고 합시다. 하나의 특정 Lambda 함수만 해당 버킷에 `s3:PutObject` 액세스하게 허용한다고 합시다. 이 경우 함수의 실행 역할에 다음과 같은 정책이 연결되어 있어야 합니다.

**Example Amazon S3 리소스에 대한 특정 Lambda 함수 액세스 권한을 부여하는 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ExampleSourceFunctionArn",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Condition": {
                "ArnEquals": {
                    "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
                }
            }
        }
    ]
}
```

이 정책은 소스가 ARN `arn:aws:lambda:us-east-1:123456789012:function:source_lambda`을(를) 사용하는 Lambda 함수인 경우만 `s3:PutObject` 액세스를 허용합니다. 이 정책은 다른 호출 자격 증명에 대한 `s3:PutObject` 액세스를 허용하지 않습니다. 이것은 다른 함수 또는 엔티티가 동일한 실행 역할로 `s3:PutObject`을(를) 호출할 때도 마찬가지입니다.

**참고**  
`lambda:SourceFunctionARN` 조건 키는 Lambda 함수 버전 또는 함수 별칭을 지원하지 않습니다. 특정 함수 버전 또는 별칭에 ARN을 사용하는 경우 함수는 지정한 작업을 수행할 권한이 없습니다. 버전 또는 별칭 접미사 없이 함수에 정규화되지 않은 ARN을 사용해야 합니다.

SCP에서도 `lambda:SourceFunctionArn`을 사용할 수 있습니다. 예를 들어 버킷에 대한 액세스를 단일 Lambda 함수의 코드 또는 특정 Amazon Virtual Private Cloud(VPC)의 호출로 제한하려고 한다고 가정해 보겠습니다. 다음 SCP에서 이 방법을 보여줍니다.

**Example 특정 조건에서 Amazon S3 대한 액세스를 거부하는 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Effect": "Deny",
            "Condition": {
                "StringNotEqualsIfExists": {
                    "aws:SourceVpc": [
                        "vpc-12345678"
                    ]
                }
            }
        },
        {
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::lambda_bucket/*",
            "Effect": "Deny",
            "Condition": {
                "ArnNotEqualsIfExists": {
                    "lambda:SourceFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:source_lambda"
                }
            }
        }
    ]
}
```

이 정책은 ARN `arn:aws:lambda:*:123456789012:function:source_lambda`을(를) 사용하는 특정 Lambda 함수에서 오지 않는 한 또는 지정된 VPC에서 오지 않는 한 모든 S3 작업을 거부합니다. `StringNotEqualsIfExists` 연산자는 `aws:SourceVpc` 키가 요청에 있는 경우에만 이 조건을 처리하도록 IAM에 지시합니다. 마찬가지로 IAM은 `lambda:SourceFunctionArn`이(가) 있는 경우에만 `ArnNotEqualsIfExists` 연산자를 고려합니다.

# 다른 AWS 엔터티에 Lambda 함수에 대한 액세스 권한 부여
<a name="permissions-granting-access"></a>

Lambda 리소스에 액세스할 수 있는 권한을 다른 AWS 계정, 조직 및 서비스에 부여하려는 경우, 다음과 같은 몇 가지 옵션이 있습니다.
+ [ID 기반 정책](access-control-identity-based.md)을 사용하여 다른 사용자에게 Lambda 리소스에 대한 액세스 권한을 부여할 수 있습니다. 자격 증명 기반 정책은 사용자에게 직접 적용하거나, 사용자와 연결된 그룹 및 역할에 적용할 수 있습니다.
+ [리소스 기반 정책](access-control-resource-based.md)을 사용하여 다른 계정과 AWS 서비스에 Lambda 리소스를 사용할 권한을 부여할 수 있습니다. 사용자가 Lambda 리소스에 액세스하려고 하면 Lambda는 사용자의 자격 증명 기반 정책 및 리소스의 리소스 기반 정책을 모두 고려합니다. Amazon Simple Storage Service(Amazon S3) 같은 AWS 서비스가 Lambda 함수를 호출하면 Lambda는 리소스 기반 정책만 고려합니다.
+ [ABAC(속성 기반 액세스 제어)](attribute-based-access-control.md) 모델을 사용하여 Lambda 함수에 대한 액세스를 제어할 수 있습니다. ABAC를 사용하면 태그를 Lambda 함수에 연결하거나, 특정 API 요청에 전달하거나, 요청을 하는 IAM 위탁자에 연결할 수 있습니다. 함수 액세스를 제어하려면 IAM 정책의 조건 요소에 동일한 태그를 지정하세요.

최소 권한 액세스에 대한 권한을 미세 조정할 수 있도록 Lambda는 정책에 포함할 수 있는 몇 가지 추가 조건을 제공합니다. 자세한 내용은 [정책의 리소스 및 조건 섹션 미세 조정](lambda-api-permissions-ref.md) 섹션을 참조하세요.

# Lambda에 대한 자격 증명 기반 IAM 정책
<a name="access-control-identity-based"></a>

AWS Identity and Access Management(IAM)에서 자격 증명 기반 정책을 사용하여 계정의 사용자에게 Lambda에 대한 액세스 권한을 부여할 수 있습니다. 자격 증명 기반 정책은 사용자, 사용자 그룹 또는 역할에 적용할 수 있습니다. 다른 계정의 사용자에게 내 계정의 역할을 수행할 수 있는 권한 및 Lambda 리소스에 대한 액세스 권한을 부여할 수도 있습니다.

Lambda는 Lambda API 작업에 대해 액세스 권한을 부여하는 AWS 관리형 정책을 제공합니다. 경우에 따라 이 정책은 Lambda 리소스를 개발하고 관리하는 데 사용되는 AWS 다른 서비스에 대한 액세스 권한도 부여합니다. Lambda는 필요에 따라 이러한 관리형 정책을 업데이트하여 정책 릴리스 시 사용자가 새 기능에 대한 액세스 권한을 가질 수 있도록 보장합니다.
+ [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_FullAccess.html) - Lambda 작업에 대한 모든 액세스 권한 및 Lambda 리소스를 개발 및 유지하는 데 사용되는 다른 AWS 서비스에 대한 모든 액세스 권한을 부여합니다.
+ [AWSLambda\$1ReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html) – Lambda 리소스에 대한 읽기 전용 액세스 권한을 부여합니다.
+ [AWSLambdaRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaRole.html) – Lambda 함수를 간접 호출할 수 있는 권한을 부여합니다.

AWS 관리형 정책은 사용자가 수정할 수 있는 Lambda 함수나 계층을 제한하지 않고 API 작업에 대한 권한을 부여합니다. 보다 세부적으로 제어하기 위해 사용자의 권한을 제한하는 정책을 직접 만들 수 있습니다.

**Topics**
+ [사용자에게 Lambda 함수에 대한 액세스 권한 부여](permissions-user-function.md)
+ [사용자에게 Lambda 계층에 대한 액세스 권한 부여](permissions-user-layer.md)

# 사용자에게 Lambda 함수에 대한 액세스 권한 부여
<a name="permissions-user-function"></a>

[자격 증명 기반 정책](access-control-identity-based.md)을 사용하여 사용자, 사용자 그룹 또는 역할이 Lambda 함수에서 작업을 실행할 수 있도록 허용합니다.

**참고**  
컨테이너 이미지로 정의된 함수의 경우, 이미지에 액세스할 수 있는 사용자 권한은 Amazon Elastic Container Registry(Amazon ECR)에서 구성해야 합니다. 예시는 [Amazon ECR 리포지토리 정책](images-create.md#configuration-images-permissions)을 참조하세요.

다음은 범위를 제한한 권한 정책의 예입니다. 사용자가 지정된 접두사(`intern-`)로 이름이 지정되고 지정된 실행 역할로 구성된 Lambda 함수를 생성하고 관리할 수 있도록 허용합니다.

**Example 함수 개발 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyPermissions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetAccountSettings",
                "lambda:GetEventSourceMapping",
                "lambda:GetFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:GetFunctionCodeSigningConfig",
                "lambda:GetFunctionConcurrency",
                "lambda:ListEventSourceMappings",
                "lambda:ListFunctions",
                "lambda:ListTags",
                "iam:ListRoles"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DevelopFunctions",
            "Effect": "Allow",
            "NotAction": [
                "lambda:AddPermission",
                "lambda:PutFunctionConcurrency"
            ],
            "Resource": "arn:aws:lambda:*:*:function:intern-*"
        },
        {
            "Sid": "DevelopEventSourceMappings",
            "Effect": "Allow",
            "Action": [
                "lambda:DeleteEventSourceMapping",
                "lambda:UpdateEventSourceMapping",
                "lambda:CreateEventSourceMapping"
            ],
            "Resource": "*",
            "Condition": {
                "ArnLike": {
                    "lambda:FunctionArn": "arn:aws:lambda:*:*:function:intern-*"
                }
            }
        },
        {
            "Sid": "PassExecutionRole",
            "Effect": "Allow",
            "Action": [
                "iam:ListRolePolicies",
                "iam:ListAttachedRolePolicies",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:PassRole",
                "iam:SimulatePrincipalPolicy"
            ],
            "Resource": "arn:aws:iam::*:role/intern-lambda-execution-role"
        },
        {
            "Sid": "ViewLogs",
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/intern-*"
        }
    ]
}
```

정책의 권한은 구문이 지원하는 [리소스 및 조건](lambda-api-permissions-ref.md)에 따라 구문으로 구성됩니다.
+ `ReadOnlyPermissions` – 찾아보기 및 보기 기능을 사용할 때 Lambda 콘솔은 이러한 권한을 사용합니다. 이들 권한은 리소스 패턴 또는 조건을 지원하지 않습니다.

  ```
              "Action": [
                  "lambda:GetAccountSettings",
                  "lambda:GetEventSourceMapping",
                  "lambda:GetFunction",
                  "lambda:GetFunctionConfiguration",           
                  "lambda:GetFunctionCodeSigningConfig",
                  "lambda:GetFunctionConcurrency",                
                  "lambda:ListEventSourceMappings",
                  "lambda:ListFunctions",      
                  "lambda:ListTags",
                  "iam:ListRoles"
              ],
              "Resource": "*"
  ```
+ `DevelopFunctions` – `AddPermission` 및 `PutFunctionConcurrency`를 제외하고 `intern-`으로 접두사가 지정된 함수에서 작동하는 모든 Lambda 작업을 사용합니다. `AddPermission`은 함수에 대한 [리소스 기반 정책](access-control-resource-based.md)을 수정하여 보안에 영향을 줄 수 있습니다. `PutFunctionConcurrency`는 함수에 대한 규모 조정 용량을 예약하여 다른 함수로부터 용량을 가져올 수 있습니다.

  ```
              "NotAction": [
                  "lambda:AddPermission",
                  "lambda:PutFunctionConcurrency"
              ],
              "Resource": "arn:aws:lambda:*:*:function:intern-*"
  ```
+ `DevelopEventSourceMappings` - `intern-`으로 접두사가 지정된 함수에 대한 이벤트 소스 매핑을 관리합니다. 이러한 작업은 이벤트 소스 매핑에 대해 작용하지만 *조건*과 함께 함수를 제한할 수 있습니다.

  ```
              "Action": [
                  "lambda:DeleteEventSourceMapping",
                  "lambda:UpdateEventSourceMapping",
                  "lambda:CreateEventSourceMapping"
              ],
              "Resource": "*",
              "Condition": {
                  "StringLike": {
                      "lambda:FunctionArn": "arn:aws:lambda:*:*:function:intern-*"
                  }
              }
  ```
+ `PassExecutionRole` – IAM 권한을 가진 사용자가 생성하고 관리해야 하는 `intern-lambda-execution-role`이라는 역할만 조회하고 전달합니다. 함수에 실행 역할을 할당할 경우 `PassRole`이 사용됩니다.

  ```
              "Action": [
                  "iam:ListRolePolicies",
                  "iam:ListAttachedRolePolicies",
                  "iam:GetRole",
                  "iam:GetRolePolicy",
                  "iam:PassRole",
                  "iam:SimulatePrincipalPolicy"
              ],
              "Resource": "arn:aws:iam::*:role/intern-lambda-execution-role"
  ```
+ `ViewLogs` – CloudWatch Logs를 사용하여, `intern-`으로 접두사가 지정된 함수에 대한 로그를 조회합니다.

  ```
              "Action": [
                  "logs:*"
              ],
              "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/intern-*"
  ```

이 정책은 사용자가 다른 사용자의 리소스를 위험하게 만들지 않고 Lambda를 시작할 수 있도록 합니다. 사용자가 더 광범위한 IAM 권한이 필요한 다른 AWS 서비스에 의해 트리거되는 기능을 구성하거나 호출하는 것은 허용하지 않습니다. 또한 CloudWatch 및 X-Ray와 같이 범위 제한 정책을 지원하지 않는 서비스에 대한 권한은 포함하지 않습니다. 사용자에게 지표 및 추적 데이터에 대한 액세스 권한을 부여하려면 이러한 서비스에 대해 읽기 전용 정책을 사용합니다.

함수에 대한 트리거를 구성할 경우 해당 함수를 간접 호출하는 AWS 서비스를 사용하기 위한 액세스 권한이 필요합니다. 예를 들어, Amazon S3 트리거를 구성하려면 버킷 알림을 관리하는 Amazon S3 작업을 사용할 수 있는 권한이 필요합니다. 이러한 권한 중 다수는 [AWSLambda\$1FullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_FullAccess.html) 관리형 정책에 포함됩니다.

# 사용자에게 Lambda 계층에 대한 액세스 권한 부여
<a name="permissions-user-layer"></a>

[자격 증명 기반 정책](access-control-identity-based.md)을 사용하여 사용자, 사용자 그룹 또는 역할이 Lambda 계층에서 작업을 실행할 수 있도록 허용합니다. 다음 정책은 계층을 만들고 이를 함수에 사용할 수 있는 권한을 사용자에게 부여합니다. 이 리소스 패턴을 통해 사용자는 계층 이름이 AWS 리전로 시작되는 한, 모든 `test-`에서 그리고 모든 계층 버전으로 작업할 수 있습니다.

**Example 계층 개발 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "PublishLayers",
            "Effect": "Allow",
            "Action": [
                "lambda:PublishLayerVersion"
            ],
            "Resource": "arn:aws:lambda:*:*:layer:test-*"
        },
        {
            "Sid": "ManageLayerVersions",
            "Effect": "Allow",
            "Action": [
                "lambda:GetLayerVersion",
                "lambda:DeleteLayerVersion"
            ],
            "Resource": "arn:aws:lambda:*:*:layer:test-*:*"
        }
    ]
}
```

함수 생성 및 구성 중 `lambda:Layer` 조건을 사용하여 계층 사용을 적용할 수도 있습니다. 예를 들어 다른 계정에서 게시한 계층을 사용자가 사용하지 못하게 할 수 있습니다. 다음 정책은 `CreateFunction` 및 `UpdateFunctionConfiguration` 작업에 조건을 추가하여 지정된 계층이 `123456789012` 계정에 속한 계층이어야 하도록 요구합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ConfigureFunctions",
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Resource": "*",
            "Condition": {
                "ForAllValues:StringLike": {
                    "lambda:Layer": [
                        "arn:aws:lambda:*:123456789012:layer:*:*"
                    ]
                }
            }
        }
    ]
}
```

------

조건이 적용되도록 하려면, 다른 구문이 이러한 작업에 대한 권한을 사용자에게 부여하지 않는지 확인하세요.

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

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

# Lambda에서 속성 기반 액세스 제어 사용
<a name="attribute-based-access-control"></a>

[속성 기반 액세스 제어(ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)를 사용하여 Lambda 리소스에 대한 액세스를 제어할 수 있습니다. 특정 Lambda 리소스에 태그를 연결하거나, 특정 API 요청에서 태그를 전달하거나, AWS Identity and Access Management(IAM) 위탁자에게 연결하여 요청할 수 있습니다. AWS 속성 기반 액세스를 부여하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*에서 [태그를 사용하여 AWS 리소스에 대한 액세스 제어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)를 참조하세요.

IAM 정책에서 Amazon 리소스 이름(ARN) 또는 IAM 정책을 지정하지 않고 ABAC를 사용하여 [최소 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)할 수 있습니다. 대신 IAM 정책 [조건 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에서 태그를 지정하여 액세스를 제어할 수 있습니다. ABAC를 사용하면 새 리소스를 생성할 때 IAM 정책을 업데이트할 필요가 없으므로 확장이 더 쉬워집니다. 대신 새 리소스에 태그를 추가하여 액세스를 제어하세요.

Lambda에서 태그는 다음 리소스에 대해 작동합니다.
+ 함수 - 함수 태그 지정에 대한 자세한 내용은 [Lambda 함수에서 태그 사용](configuration-tags.md) 섹션을 참조하세요.
+ 코드 서명 구성 - 코드 서명 구성에 태그를 지정하는 방법에 대한 자세한 내용은 [코드 서명 구성에 태그 사용](tags-csc.md) 섹션을 참조하세요.
+ 이벤트 소스 매핑 - 이벤트 소스 매핑에 태그를 지정하는 방법에 대한 자세한 내용은 [이벤트 소스 매핑에 태그 사용](tags-esm.md) 섹션을 참조하세요.

계층에는 태그가 지원되지 않습니다.

다음 조건 키를 사용하면 태그 기반의 IAM 정책 규칙을 작성할 수 있습니다.
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag): Lambda 리소스에 연결된 태그를 기반으로 액세스를 제어합니다.
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag): 새 함수를 만들 때와 같이 요청에 태그가 있어야 합니다.
+ [aws:PrincipalTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-principaltag): IAM 위탁자(요청을 하는 사람)이 자신의 IAM [사용자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_users.html) 또는 [역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_roles.html)에 연결된 태그를 기반으로 수행할 수 있는 권한을 제어합니다.
+  [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys): 요청에서 특정 키를 사용할 수 있는지 여부를 제어합니다.

 조건을 지원하는 작업에 대해서만 조건을 지정할 수 있습니다. 각 Lambda 작업에서 지원되는 조건 목록은 서비스 승인 참조의 [AWS Lambda의 작업, 리소스 및 조건 키](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)를 참조하세요. **aws:ResourceTag/tag-key** 지원은 ‘AWS Lambda에서 정의한 리소스 유형’을 참조하세요. **aws:RequestTag/tag-key** 및 **aws:TagKeys** 지원은 ‘AWS Lambda에서 정의한 작업’을 참조하세요.

**Topics**
+ [태그로 함수 보안](attribute-based-access-control-example.md)

# 태그로 함수 보안
<a name="attribute-based-access-control-example"></a>

다음 단계에서는 ABAC를 사용하여 함수에 대한 권한을 설정하는 한 가지 방법을 보여줍니다. 이 예제 시나리오에서는 4개의 IAM 권한 정책을 생성합니다. 그런 다음 이러한 정책을 새 IAM 역할에 연결합니다. 마지막으로 IAM 사용자를 만들고 해당 사용자에게 새 역할을 수임할 권한을 부여합니다.

**Topics**
+ [사전 조건](#abac-prerequisites)
+ [1단계: 새 함수에 태그 필요](#require-tag-on-create)
+ [2단계: Lambda 함수 및 IAM 위탁자에 연결된 태그를 기반으로 작업 허용](#restrict-actions-function-tags)
+ [3단계: 목록 권한 부여](#abac-list-permissions)
+ [4단계: IAM 권한 부여](#abac-iam-permissions)
+ [5단계 - IAM 역할 생성](#abac-create-role)
+ [6단계: IAM 사용자 생성](#abac-create-user)
+ [7단계: 권한 테스트](#abac-test)
+ [8단계: 리소스 정리](#abac-clean-up)

## 사전 조건
<a name="abac-prerequisites"></a>

[Lambda 실행 역할](lambda-intro-execution-role.md)이 있는지 확인하십시오. IAM 권한을 부여할 떄와 Lambda 함수를 만들 때 이 역할을 사용합니다.

## 1단계: 새 함수에 태그 필요
<a name="require-tag-on-create"></a>

Lambda와 함께 ABAC를 사용하는 경우 모든 함수에 태그가 필요한 것이 모범 사례입니다. 이렇게 하면 ABAC 권한 정책이 예상대로 작동할 수 있습니다.

다음과 비슷한 [IAM 정책을 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)합니다. 이 정책은 [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag), [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 및 [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 조건 키를 사용하여 새 함수와 해당 함수를 생성하는 IAM 위탁자가 모두 `project` 태그를 갖도록 요구합니다. `ForAllValues` 수정자는 `project` 태그만 허용되게 합니다. `ForAllValues` 수정자를 포함하지 않는 경우 사용자는 `project`울(를) 통과하는 한 함수에 다른 태그를 추가할 수 있습니다.

**Example - 새 함수에 태그 필요**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:TagResource"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*",
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/project": "${aws:PrincipalTag/project}",
          "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
        },
        "ForAllValues:StringEquals": {
          "aws:TagKeys": "project"
        }
      }
    }
  }
```

## 2단계: Lambda 함수 및 IAM 위탁자에 연결된 태그를 기반으로 작업 허용
<a name="restrict-actions-function-tags"></a>

[aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 조건 키를 사용하여 위탁자의 태그가 함수에 연결된 태그와 일치할 것을 요구하는 두 번째 IAM 정책을 생성합니다.. 다음 예제 정책에서는 `project` 태그가 있는 위탁자가 `project` 태그가 있는 함수를 간접 호출하도록 허용합니다. 함수에 다른 태그가 있으면 작업이 거부됩니다.

**Example — 함수와 IAM 위탁자에 일치하는 태그 필요**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lambda:InvokeFunction",
          "lambda:GetFunction"
        ],
        "Resource": "arn:aws:lambda:*:*:function:*",
        "Condition": {
          "StringEquals": {
            "aws:ResourceTag/project": "${aws:PrincipalTag/project}"
          }
        }
      }
    ]
  }
```

## 3단계: 목록 권한 부여
<a name="abac-list-permissions"></a>

위탁자가 Lambda 함수 및 IAM 역할을 나열할 수 있도록 허용하는 정책을 생성합니다. 이렇게 하면 위탁자가 콘솔에서 그리고 API 작업을 호출할 때 모든 Lambda 함수와 IAM 역할을 볼 수 있습니다.

**Example — Lambda 및 IAM 목록 권한 부여**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "AllResourcesLambdaNoTags",
        "Effect": "Allow",
        "Action": [
          "lambda:GetAccountSettings",
          "lambda:ListFunctions",
          "iam:ListRoles"
        ],
        "Resource": "*"
      }
    ]
  }
```

## 4단계: IAM 권한 부여
<a name="abac-iam-permissions"></a>

**iam:PassRole**을 허용하는 정책을 생성합니다. 이 권한은 함수에 실행 역할을 할당할 때 필요합니다. 다음 예제 정책에서는 예제 ARN을 Lambda 실행 역할의 ARN으로 바꿉니다.

**참고**  
`ResourceTag` 작업을 포함하는 정책에는 `iam:PassRole` 조건 키를 사용하지 마세요. IAM 역할에서는 태그를 사용하여 누가 해당 역할을 전달할 수 있는지 액세스 권한을 제어할 수 없습니다. 서비스에 역할을 전달할 수 있는 권한 부여에 대한 자세한 내용은 [사용자에게 AWS 서비스에 역할을 전달할 권한 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)를 참조하세요.

**Example — 실행 역할을 전달할 수 있는 권한 부여**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": "arn:aws:iam::111122223333:role/lambda-ex"
      }
    ]
  }
```

## 5단계 - IAM 역할 생성
<a name="abac-create-role"></a>

[역할을 사용하여 권한을 위임](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#delegate-using-roles)하는 모범 사례입니다. `abac-project-role`이라고 하는 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console):
+ **1단계: 신뢰할 수 있는 엔터티 선택**에서 **AWS 계정**을 선택한 다음 **이 계정**을 선택합니다.
+ **2단계: 권한 추가**에서는 이전 단계에서 생성한 네 가지 IAM 정책을 연결합니다.
+ **3단계: 이름, 검토 및 생성**에서는 **태그 추가**를 선택합니다. **키**에 `project`를 입력합니다. **값(Value)**을 입력하지 마십시오.

## 6단계: IAM 사용자 생성
<a name="abac-create-user"></a>

`abac-test-user`(이)라고 하는 [IAM 사용자를 생성합니다](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console). **권한 설정(Set permissions)** 섹션에서 **기존 정책 직접 연결(Attach existing policies directly)**을 선택한 후 **정책 생성(Create policy)**을 선택합니다. 다음 정책 정의를 입력합니다. *111122223333*을 [AWS 계정 ID](https://docs.aws.amazon.com/general/latest/gr/acct-identifiers.html#FindingYourAccountIdentifiers)로 바꿉니다. 이 정책은 `abac-test-user`이(가) `abac-project-role`을(를) 수임할 수 있게 허용합니다.

**Example — IAM 사용자가 ABAC 역할을 수임할 수 있게 허용**  

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::111122223333:role/abac-project-role"
    }
  }
```

------

## 7단계: 권한 테스트
<a name="abac-test"></a>

1. AWS 콘솔에 `abac-test-user`(으)로 로그인합니다. 자세한 정보는 [IAM 사용자로 로그인](https://docs.aws.amazon.com/IAM/latest/UserGuide/console.html#user-sign-in-page)을 참조하십시오.

1. `abac-project-role` 역할로 전환합니다. 자세한 내용은 [역할(콘솔) 전환](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)을 참조하십시오.

1. [Lambda 함수 생성](configuration-tags.md#using-tags-with-the-console):
   + **권한(Permissions)**에서 **기본 실행 역할 변경(Change default execution role)**을 선택하고 **실행 역할(Execution role)**을 선택한 후 **기존 역할 사용(Use an existing role)**을 선택합니다. [4단계: IAM 권한 부여](#abac-iam-permissions)에서 사용한 것과 동일한 실행 역할을 선택합니다.
   + **고급 설정(Advanced settings)**에서 **태그 사용(Enable tags)**를 선택한 다음 **새 태그 추가(Add new tag)**를 선택합니다. **키**에 `project`를 입력합니다. **값(Value)**을 입력하지 마십시오.

1. [함수를 테스트합니다](testing-functions.md).

1. 두 번째 Lambda 함수를 생성하고 다른 태그(예: `environment`)를 추가합니다. [1단계: 새 함수에 태그 필요](#require-tag-on-create)에서 만든 ABAC 정책은 위탁자가 `project` 태그를 사용하여 함수를 만들 수만 있도록 허용하기 때문에 이 작업이 실패합니다.

1. 태그 없이 세 번째 함수를 만듭니다. [1단계: 새 함수에 태그 필요](#require-tag-on-create)에서 만든 ABAC 정책은 위탁자가 태그 없이 함수를 만들 수만 있도록 허용하지 않기 때문에 이 작업이 실패합니다.

이 권한 부여 전략을 사용하면 각 새 사용자에 대해 새 정책을 만들지 않고도 액세스를 제어할 수 있습니다. 새 사용자에게 액세스 권한을 부여하려면 할당된 프로젝트에 해당하는 역할을 수임할 권한을 부여하기만 하면 됩니다.

## 8단계: 리소스 정리
<a name="abac-clean-up"></a>

**IAM 역할 삭제**

1. IAM 콘솔에서 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. [5단계](#abac-create-role)에서 생성한 역할을 선택합니다.

1. **삭제**를 선택합니다.

1. 삭제를 확인하려면 텍스트 입력 필드에 역할 이름을 입력합니다.

1. **삭제**를 선택합니다.

**IAM 사용자를 삭제하려면 다음을 수행하세요.**

1. IAM 콘솔의 [사용자 페이지](https://console.aws.amazon.com/iam/home#/users)를 엽니다.

1. [6단계](#abac-create-user)에서 생성한 IAM 사용자를 선택합니다.

1. **삭제**를 선택합니다.

1. 삭제를 확인하려면 텍스트 입력 필드에 사용자 이름을 입력합니다.

1. **Delete user(사용자 삭제)**를 선택합니다.

**Lambda 함수를 삭제하려면**

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

1. 생성한 함수를 선택합니다.

1. **작업**, **삭제**를 선택합니다.

1. 텍스트 입력 필드에 **confirm**를 입력하고 **Delete**(삭제)를 선택합니다.

# 정책의 리소스 및 조건 섹션 미세 조정
<a name="lambda-api-permissions-ref"></a>

AWS Identity and Access Management(IAM) 정책에 리소스와 조건을 지정하여 사용자 권한의 범위를 제한할 수 있습니다. 정책에서 각각의 작업은 해당 작업의 동작에 따라 다양한 조합의 리소스와 조건을 지원합니다.

각 IAM 정책 구문은 리소스에 대해 수행되는 작업에 대한 권한을 부여합니다. 지명된 리소스에서 이루어지는 작업이 아니거나 모든 리소스에 대해 그 작업을 수행할 수 있도록 권한을 부여하는 경우, 정책에서 해당 리소스의 값은 와일드카드(`*`)가 됩니다. 대부분의 작업에서는 리소스의 Amazon 리소스 이름(ARN) 또는 복수의 리소스에 맞는 ARN 패턴을 지정함으로써 사용자 수정이 가능한 리소스를 제한할 수 있습니다.

리소스 유형별로 작업 범위를 제한하는 방법에 대한 일반적인 설계는 다음과 같습니다.
+ 함수 – 함수에 대한 작업도 특정 함수에만 실행되도록 함수, 버전, 별칭 ARN 등으로 제한할 수 있습니다.
+ 이벤트 소스 매핑 - ARN을 통해 작업을 특정 이벤트 소스 매핑 리소스로 제한할 수 있습니다. 이벤트 소스 매핑은 항상 함수와 연결됩니다. `lambda:FunctionArn` 조건을 사용하여 관련 기능별로 작업을 제한할 수도 있습니다.
+ 계층 - 계층 사용 및 권한과 관련된 작업은 계층의 버전에 적용됩니다.
+ 코드 서명 구성 - ARN을 통해 특정 코드 서명 구성 리소스로 작업을 제한할 수 있습니다.
+ 태그 - 표준 태그 조건을 사용합니다. 자세한 내용은 [Lambda에서 속성 기반 액세스 제어 사용](attribute-based-access-control.md) 섹션을 참조하세요.

리소스별 권한을 제한하려면 ARN으로 리소스를 지정하세요.

**Lambda 리소스 ARN 형식**
+ 함수 - `arn:aws:lambda:us-west-2:123456789012:function:my-function`
+ 함수 버전 - `arn:aws:lambda:us-west-2:123456789012:function:my-function:1`
+ 함수 별칭 - `arn:aws:lambda:us-west-2:123456789012:function:my-function:TEST`
+ 이벤트 소스 매핑 - `arn:aws:lambda:us-west-2:123456789012:event-source-mapping:fa123456-14a1-4fd2-9fec-83de64ad683de6d47`
+ 계층 - `arn:aws:lambda:us-west-2:123456789012:layer:my-layer`
+ 계층 버전 - `arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1`
+ 코드 서명 구성 - `arn:aws:lambda:us-west-2:123456789012:code-signing-config:my-csc`

예를 들어 다음 정책을 통해 AWS 계정 `123456789012` 사용자는 미국 서부(오리건) AWS 리전에서 `my-function`이라는 함수를 간접 호출할 수 있습니다.

**Example 함수 정책 간접 호출**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Invoke",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function"
        }
    ]
}
```

이것은 작업 ID(`lambda:InvokeFunction`)가 API 작업([간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html))과 다른 특수한 경우입니다. 다른 작업의 경우, 작업 이름 앞에 `lambda:`를 붙인 것이 작업 ID입니다.

**Topics**
+ [정책의 조건 섹션 이해](#authorization-conditions)
+ [정책의 리소스 섹션에서 함수 참조](#function-resources)
+ [지원되는 IAM 작업 및 함수 동작](#permissions-resources)

## 정책의 조건 섹션 이해
<a name="authorization-conditions"></a>

조건이란 허용되는 작업인지 여부를 판단하기 위해 로직을 추가로 적용하는 선택적 정책 요소를 말합니다. 모든 작업에서 지원되는 일반 [조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html) 외에, Lambda는 일부 작업에서 추가 파라미터 값을 제한하는 데 사용할 수 있는 조건 유형도 정의합니다.

예를 들어, `lambda:Principal` 조건으로는 사용자가 함수의 [리소스 기반 정책](access-control-resource-based.md)에 대한 호출 액세스 권한을 부여할 수 있는 서비스 또는 계정을 제한합니다. 다음 정책에 따르면 사용자는 `test` 함수 간접 호출 권한을 Amazon Simple Notification Service(Amazon SNS) 주제에 부여할 수 있습니다.

**Example 함수 정책 권한 관리**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ManageFunctionPolicy",
            "Effect": "Allow",
            "Action": [
                "lambda:AddPermission",
                "lambda:RemovePermission"
            ],
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:test:*",
            "Condition": {
                "StringEquals": {
                    "lambda:Principal": "sns.amazonaws.com"
                }
            }
        }
    ]
}
```

이 조건은 위탁자가 다른 서비스 또는 계정이 아닌 Amazon SNS여야 합니다. 리소스 패턴에 따르면 함수 이름은 `test`이고 버전 번호나 별칭이 포함되어야 합니다. 예를 들어 `test:v1`입니다.

Lambda 및 기타 AWS 서비스의 리소스 및 조건에 대한 자세한 내용은 *서비스 승인 참조*에서 [AWS 서비스에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html)를 참조하세요.

## 정책의 리소스 섹션에서 함수 참조
<a name="function-resources"></a>

Amazon 리소스 이름(ARN)을 사용하여 정책 설명에서 Lambda 함수를 참조합니다. 함수 ARN의 형식은 전체 함수를 참조(비정규화)하는지, 함수 [버전](configuration-versions.md) 또는 [별칭](configuration-aliases.md)을 참조(정규화)하는지에 따라 다릅니다.

Lambda API를 호출할 때 사용자는 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) `FunctionName` 파라미터의 버전 ARN 또는 별칭 ARN을 전달하거나 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) `Qualifier` 파라미터의 값을 설정하여 버전 또는 별칭을 지정할 수 있습니다. Lambda는 IAM 정책의 리소스 요소와 API 호출로 전달된 `FunctionName`과 `Qualifier`를 비교하여 권한 부여를 결정합니다. 불일치가 있는 경우 Lambda는 요청을 거부합니다.

함수에 대한 작업을 허용하든지 거부하든지 간에 예상한 결과를 얻으려면 정책 설명에서 올바른 함수 ARN 유형을 사용해야 합니다. 예를 들어, 정책이 정규화되지 않은 ARN을 참조하는 경우 Lambda는 정규화되지 않은 ARN을 참조하는 요청을 수락하지만 정규화된 ARN을 참조하는 요청은 거부합니다.

**참고**  
와일드카드 문자(\$1)를 사용하여 계정 ID와 일치시킬 수 없습니다. 허용되는 정책에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM JSON 정책 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)를 참조하세요.

**Example 정규화되지 않은 ARN의 호출 허용**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction"
        }
    ]
}
```

정책이 정규화된 특정 ARN을 참조하는 경우, Lambda는 해당 ARN을 참조하는 요청을 수락하지만 `myFunction:2`와 같이 정규화되지 않은 ARN 또는 정규화된 다른 ARN을 참조하는 요청은 거부합니다.

**Example 정규화된 특정 ARN의 호출 허용**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:1"
        }
    ]
}
```

정책이 `:*`를 사용하는 정규화된 ARN을 참조하는 경우, Lambda는 정규화된 모든 ARN을 수락하지만 정규화되지 않은 ARN을 참조하는 요청은 거부합니다.

**Example 정규화된 모든 ARN의 호출 허용**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:*"
        }
    ]
}
```

정책이 `*`를 사용하는 모든 ARN을 참조하는 경우, Lambda는 정규화된 ARN 또는 정규화되지 않은 ARN을 수락합니다.

**Example 정규화된 ARN 또는 정규화되지 않은 ARN의 호출 허용**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-west-2:123456789012:function:myFunction*"
        }
    ]
}
```

## 지원되는 IAM 작업 및 함수 동작
<a name="permissions-resources"></a>

 작업은 IAM 정책을 통해 허용할 수 있는 항목을 정의합니다. Lambda에서 지원되는 작업 목록은 서비스 승인 참조의 [AWS Lambda에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com//service-authorization/latest/reference/list_awslambda.html)를 참조하세요. IAM 작업이 Lambda API 작업을 허용하는 경우 대개 IAM 작업의 이름은 Lambda API 작업의 이름과 동일하지만 다음과 같은 예외가 있습니다.


| API 작업 | IAM 작업 | 
| --- | --- | 
| [간접 호출](https://docs.aws.amazon.com//lambda/latest/api/API_Invoke.html) | lambda:InvokeFunction | 
| [GetLayerVersion](https://docs.aws.amazon.com//lambda/latest/api/API_GetLayerVersion.html) [GetLayerVersionByArn](https://docs.aws.amazon.com//lambda/latest/api/API_GetLayerVersionByArn.html) | lambda:GetLayerVersion | 

[서비스 권한 부여 참조](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html)에 정의된 리소스와 조건 외에도 Lambda는 특정 작업에 대해 다음과 같은 리소스와 조건을 지원합니다. 이 중 상당수는 정책의 리소스 섹션에 있는 함수 참조와 관련이 있습니다. 아래 표에 설명된 것과 같이, 함수에 대한 작업도 특정 함수에만 실행되도록 함수, 버전, 별칭 ARN 등으로 제한할 수 있습니다.


| 작업 | 리소스 | Condition | 
| --- | --- | --- | 
|  [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html) [간접적으로 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)(**권한:** `lambda:InvokeFunction`)  |  함수 버전 함수 별칭  |  해당 사항 없음  | 
|  [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)  |  해당 사항 없음  |  `lambda:CodeSigningConfigArn`  | 
|  [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html) [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html) [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html) [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)  |  함수 별칭  |  N/A  | 