

# AWS Lambda 함수 구성
<a name="lambda-functions"></a>

Lambda API 또는 콘솔을 사용하여 Lambda 함수의 핵심 기능 및 옵션을 구성하는 방법을 알아봅니다.

**[.zip 파일 아카이브](configuration-function-zip.md) **  
종속성, 사용자 지정 런타임 계층 또는 함수 코드 이외의 모든 파일을 포함하려는 경우 Lambda 함수 배포 패키지를 생성합니다. 배포 패키지는 함수 코드와 해당 종속성이 포함된 .zip 파일 아카이브입니다.

**[컨테이너 이미지](images-create.md) **  
빌드 프로세스를 더 효과적으로 제어해야 하거나 함수에 사용자 지정 런타임 구성이 필요한 경우 컨테이너 이미지를 사용하여 함수 코드와 종속성을 패키징합니다. Docker CLI와 같은 도구를 사용하여 Lambda 함수를 컨테이너 이미지로 빌드, 테스트 및 배포할 수 있습니다.

**[메모리](configuration-memory.md)**  
함수 메모리를 늘리는 경우와 방법을 알아봅니다.

**[임시 스토리지](configuration-ephemeral-storage.md) **  
함수의 임시 스토리지 용량을 늘리는 경우와 방법을 알아봅니다.

**[제한 시간](configuration-timeout.md) **  
함수의 제한 시간 값을 늘리는 경우와 방법을 알아봅니다.

**[지속성 구성](durable-configuration.md) **  
간접 호출 사이에 상태를 유지하면서 Lambda 함수를 최대 1년까지 장기간 실행할 수 있습니다. 장기 실행 상태 저장 워크플로에 대한 실행 제한 시간, 상태 보존, 버전 관리 동작을 구성합니다. 지속성 함수를 사용하면 일시 중지, 재개 및 자동 중단 처리가 가능한 복잡한 다단계 프로세스를 빌드할 수 있습니다.

** [ 환경 변수](configuration-envvars.md)**  
환경 변수를 사용하여 함수 구성에 함수 코드를 저장하면, 함수 코드의 이식성을 높이고 코드에 보안 암호가 포함되지 않도록 할 수 있습니다.

**[아웃바운드 네트워킹](configuration-vpc.md) **  
 Amazon VPC의 AWS 리소스와 함께 Lambda 함수를 사용할 수 있습니다. 함수를 VPC에 연결하면 관계형 데이터베이스 및 캐시와 같은 프라이빗 서브넷의 리소스에 액세스할 수 있습니다.

** [인바운드 네트워킹](configuration-vpc-endpoints.md)**  
인터페이스 VPC 엔드포인트를 사용하여 공용 인터넷을 통과하지 않고 Lambda 함수를 간접 호출할 수 있습니다.

**[파일 시스템](configuration-filesystem.md)**  
 Lambda 함수를 사용하여 Amazon EFS를 로컬 디렉터리에 마운트할 수 있습니다. 파일 시스템을 사용하면 함수 코드가 안전하고 높은 동시성으로 공유 리소스에 액세스하여 수정할 수 있습니다.

**[별칭](configuration-aliases.md)**  
클라이언트를 업데이트하는 대신, 별칭을 사용하여 특정 Lambda 함수 버전을 간접 호출함으로써 클라이언트를 구성할 수 있습니다.

**[버전](configuration-versions.md)**  
함수의 버전을 게시하여 변경할 수 없는 별도의 리소스로 코드와 구성을 저장할 수 있습니다.

**[Tags](configuration-tags.md)**  
ABAC(속성 기반 액세스 제어)를 활성화하고, Lambda 함수를 구성하고, AWS Cost Explorer 또는 AWS 결제 및 비용 관리 서비스를 사용하여 함수에 대한 보고서를 필터링 및 생성하려면 태그를 사용합니다.

**[응답 스트리밍](configuration-response-streaming.md)**  
응답 페이로드를 클라이언트로 다시 스트리밍하도록 Lambda 함수 URL을 구성할 수 있습니다. 응답 스트리밍은 첫 번째 바이트까지 시간(TTFB) 성능을 개선하여 지연 시간에 민감한 애플리케이션에 도움이 될 수 있습니다. 이는 부분 응답을 사용할 수 있게 되면 클라이언트에 다시 전송할 수 있기 때문입니다. 또한 응답 스트리밍을 사용하여 더 큰 페이로드를 반환하는 함수를 빌드할 수 있습니다.

**[메타데이터 엔드포인트](configuration-metadata-endpoint.md)**  
동일한 가용 영역 리소스로 라우팅하여 지연 시간을 최적화하고 가용 영역을 인식하는 복원력 패턴을 구현할 수 있도록 Lambda 메타데이터 엔드포인트를 사용하여 함수가 실행 중인 가용 영역을 검색합니다.

# .zip 파일 아카이브를 사용하여 Lambda 함수 배포
<a name="configuration-function-zip"></a>

Lambda 함수를 만들 때 배포 패키지에 함수 코드를 패키징합니다. Lambda는 컨테이너 이미지와 .zip 파일 아카이브라는 두 가지 배포 패키지를 지원합니다. 함수를 만드는 워크플로는 배포 패키지 유형에 따라 다릅니다. 컨테이너 이미지로 정의된 함수를 구성하려면 [컨테이너 이미지를 사용하여 Lambda 함수 생성](images-create.md) 섹션을 참조하세요.

Lambda 콘솔과 Lambda API를 사용하여 .zip 파일 아카이브로 정의된 함수를 만들 수 있습니다. 업데이트된 .zip 파일을 업로드하여 함수 코드를 변경할 수도 있습니다.

**참고**  
기존 함수의 [배포 패키지 유형](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType)(.zip 또는 컨테이너 이미지)은 변경할 수 없습니다. 예를 들어 .zip 파일 아카이브를 사용하도록 컨테이너 이미지 함수를 변환할 수는 없습니다. 새로운 함수를 생성해야 합니다.

**Topics**
+ [함수 생성](#configuration-function-create)
+ [콘솔 코드 편집기 사용](#configuration-functions-console-update)
+ [함수 코드 업데이트](#configuration-function-update)
+ [런타임 변경](#configuration-function-runtime)
+ [아키텍처 변경](#configuration-function-arch)
+ [Lambda API 사용](#configuration-function-api)
+ [함수 코드 다운로드](#configuration-function-download)
+ [CloudFormation](#configuration-function-cloudformation)
+ [Lambda .zip 배포 패키지 암호화](encrypt-zip-package.md)

## 함수 생성
<a name="configuration-function-create"></a>

.zip 파일 아카이브로 정의된 함수를 만들 때 코드 템플릿, 언어 버전, 함수의 실행 역할을 선택합니다. Lambda가 함수를 생성하면 함수 코드를 추가합니다.

**함수를 만들려면**

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

1. **함수 생성**을 선택합니다.

1. 함수 생성을 위해 **새로 작성** 또는 **블루프린트 사용**을 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.

   1. **함수 이름(Function name)**에 함수 이름을 입력합니다. 함수 이름은 64자로 제한됩니다.

   1. **런타임**에서 함수에 사용할 언어 버전을 선택합니다.

   1. (선택 사항) [**아키텍처(Architecture)**]에서 함수에 사용할 명령 세트 아키텍처를 선택합니다. 기본 아키텍처는 x86\$164입니다. 함수의 배포 패키지를 빌드할 때 해당 이미지가 이 [명령 세트 아키텍처](foundation-arch.md)와 호환되는지 확인합니다.

1. (선택 사항) **권한(Permissions)**에서 **기본 실행 역할 변경(Change default execution role)**을 확장합니다. 새로운 **실행 역할**을 생성하거나 기존 역할을 사용할 수 있습니다.

1. (선택 사항) **Advanced settings(고급 설정)**를 확장합니다. 함수에 대한 **코드 서명 구성**을 선택할 수 있습니다. 액세스할 함수에 대해 (Amazon VPC)를 구성할 수도 있습니다.

1. **함수 생성**을 선택합니다.

Lambda가 새 함수를 생성합니다. 이제 콘솔을 사용하여 함수 코드를 추가하고 다른 함수 파라미터와 기능을 구성할 수 있습니다. 코드 배포 지침은 함수에서 사용하는 런타임의 핸들러 페이지를 참조하세요.

------
#### [ Node.js ]

[.zip 파일 아카이브를 사용하여 Node.js Lambda 함수 배포](nodejs-package.md) 

------
#### [ Python ]

 [Python Lambda 함수에 대한 .zip 파일 아카이브 작업](python-package.md) 

------
#### [ Ruby ]

 [.zip 파일 아카이브를 사용하여 Ruby Lambda 함수 배포](ruby-package.md) 

------
#### [ Java ]

 [.zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포](java-package.md) 

------
#### [ Go ]

 [.zip 파일 아카이브를 사용하여 Go Lambda 함수 배포](golang-package.md) 

------
#### [ C\$1 ]

 [.zip 파일 아카이브를 사용하여 C\$1 Lambda 함수를 빌드 및 배포](csharp-package.md) 

------
#### [ PowerShell ]

 [.zip 파일 아카이브를 사용하여 PowerShell Lambda 함수 배포](powershell-package.md) 

------

## 콘솔 코드 편집기 사용
<a name="configuration-functions-console-update"></a>

콘솔은 단일 소스 파일로 Lambda 함수를 생성합니다. 스크립트 언어에 맞게 기본 제공 코드 편집기에서 이 파일을 편집하고 더 많은 파일을 추가할 수 있습니다. 변경 사항을 저장하려면 [**Save**]를 선택합니다. 그런 다음 코드를 실행하려면 **테스트**를 선택합니다.

함수 코드를 저장하면 Lambda 콘솔에서 .zip 파일 아카이브 배포 패키지를 만듭니다. 콘솔 외부에서 (IDE를 사용해) 함수 코드를 개발하는 경우 Lambda 함수에 코드를 업로드하려면 [배포 패키지를 생성](nodejs-package.md)해야 합니다.

## 함수 코드 업데이트
<a name="configuration-function-update"></a>

스크립트 언어(Node.js, Python, Ruby)에 맞게 내장된 코드 편집기에서 함수 코드를 편집할 수 있습니다. 코드가 3MB보다 크거나 라이브러리를 추가해야 하는 경우 또는 편집기가 지원하지 않는 언어(Java, Go, C\$1)의 경우, 함수 코드를 .zip 아카이브로 업로드해야 합니다. .zip 파일 아카이브가 50MB보다 작은 경우, 로컬 시스템에서 .zip 파일 아카이브를 업로드할 수 있습니다. 파일이 50MB보다 큰 경우 Amazon S3 버킷에서 함수로 파일을 업로드합니다.

**함수 코드를 .zip 아카이브로 업로드하려면**

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

1. 업데이트할 함수를 선택하고 **코드** 탭을 선택합니다.

1. **코드 소스(Code source)**에서 **업로드(Upload from)**를 선택합니다.

1. **.zip 파일**을 선택한 후 [**업로드(Upload)**]를 선택합니다.

   1. 파일 선택기에서 새 이미지 버전을 선택하고 [**열기(Open)**]와 [**저장(Save)**]을 차례로 선택합니다.

1. (4단계의 대안) **Amazon S3 위치**를 선택합니다.

   1. 텍스트 상자에서 .zip 파일 아카이브의 S3 링크 URL을 입력한 후 **저장**을 선택합니다.

## 런타임 변경
<a name="configuration-function-runtime"></a>

새 런타임을 사용하도록 함수 구성을 업데이트하는 경우, 새 런타임과 호환되도록 함수 코드를 업데이트해야 할 수 있습니다. 다른 런타임을 사용하도록 함수 구성을 업데이트하는 경우, 런타임 및 아키텍처와 호환되는 새로운 함수 코드를 **제공해야 합니다**. 함수 코드의 배포 패키지를 만드는 방법에 대한 지침은 함수가 사용하는 런타임의 핸들러 페이지를 참조하세요.

Node.js 20, Python 3.12, Java 21, .NET 8, Ruby 3.3 이상의 기본 이미지는 Amazon Linux 2023 최소 컨테이너 이미지를 기반으로 합니다. 이전 기본 이미지는 Amazon Linux 2를 사용합니다. AL2023은 작은 배포 공간과 `glibc`와 같이 업데이트된 라이브러리 버전을 포함하여 Amazon Linux 2에 비해 여러 가지 이점을 제공합니다. 자세한 내용은 [AWS Lambda을 위한 Amazon Linux 2023 런타임 소개](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)를 AWS Compute 블로그에서 참조하세요.

**런타임을 변경하려면**

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

1. 업데이트할 함수를 선택하고 **코드** 탭을 선택합니다.

1. 코드 편집기 아래에 있는 **런타임 설정** 섹션까지 아래로 스크롤합니다.

1. **편집**을 선택합니다.

   1. **Runtime**(런타임)에서 런타임 식별자를 선택합니다.

   1. **핸들러**에서 함수의 파일 이름과 핸들러를 지정합니다.

   1. [**아키텍처(Architecture)**]에서 함수에 사용할 명령 세트 아키텍처를 선택합니다.

1. **저장**을 선택합니다.

## 아키텍처 변경
<a name="configuration-function-arch"></a>

명령 세트 아키텍처를 변경하려면 먼저 함수의 코드가 대상 아키텍처와 호환되는지 확인해야 합니다.

Node.js, Python 또는 Ruby를 사용하고 내장된 편집기에서 함수 코드를 편집할 경우, 기존 코드는 수정 없이 실행될 수 있습니다.

그러나 .zip 파일 아카이브 배포 패키지를 사용하여 함수 코드를 제공하는 경우에는 대상 런타임 및 명령 세트 아키텍처에 맞게 올바르게 컴파일되고 빌드되는 새로운 .zip 파일 아카이브를 준비해야 합니다. 자세한 내용은 함수 런타임의 핸들러 페이지를 참조하세요.

**명령 세트 아키텍처를 변경하려면**

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

1. 업데이트할 함수를 선택하고 **코드** 탭을 선택합니다.

1. **런타임 설정**에서 **편집**을 선택합니다.

1. [**아키텍처(Architecture)**]에서 함수에 사용할 명령 세트 아키텍처를 선택합니다.

1. **저장**을 선택합니다.

## Lambda API 사용
<a name="configuration-function-api"></a>

.zip 파일 아카이브를 사용하는 함수를 만들고 구성하려면 다음 API 작업을 사용합니다.
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)

## 함수 코드 다운로드
<a name="configuration-function-download"></a>

Lambda 콘솔을 통해 함수 코드 .zip의 현재 게시되지 않은(`$LATEST`) 버전을 다운로드할 수 있습니다. 이렇게 하려면 먼저 다음 IAM 권한이 있는지 확인합니다.
+ `iam:GetPolicy`
+ `iam:GetPolicyVersion`
+ `iam:GetRole`
+ `iam:GetRolePolicy`
+ `iam:ListAttachedRolePolicies`
+ `iam:ListRolePolicies`
+ `iam:ListRoles`

**함수 코드 .zip을 다운로드하려면**

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

1. 함수 코드 .zip을 다운로드할 함수를 선택합니다.

1. **함수 개요**에서 **다운로드** 버튼을 선택한 다음 **함수 코드 .zip 다운로드**를 선택합니다.

   1. 또는 **AWS SAM 파일 다운로드**를 선택하여 함수의 구성에 따라 SAM 템플릿을 생성하고 다운로드합니다. **둘 다 다운로드**를 선택하여 .zip 템플릿과 SAM 템플릿을 모두 다운로드할 수도 있습니다.

## CloudFormation
<a name="configuration-function-cloudformation"></a>

CloudFormation을 사용해 .zip 파일 아카이브를 사용하는 Lambda 함수를 생성할 수 있습니다. CloudFormation 템플릿에서 `AWS::Lambda::Function` 리소스는 Lambda 함수를 지정합니다. `AWS::Lambda::Function` 리소스의 속성에 대한 설명은 *AWS CloudFormation 사용 설명서*의 [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)을 참조하세요.

`AWS::Lambda::Function` 리소스에서 다음 속성을 설정하여 .zip 파일 아카이브로 정의된 함수를 생성합니다.
+ AWS::Lambda::Function
  + PackageType - `Zip`(으)로 설정합니다.
  + 코드 - `S3Bucket` 및 `S3Key` 필드에 Amazon S3 버킷 이름과 .zip 파일 이름을 입력합니다. Node.js 또는 Python의 경우 Lambda 함수의 인라인 소스 코드를 제공할 수 있습니다.
  + 런타임 - 런타임 값을 설정합니다.
  + 아키텍처 - AWS Graviton2 프로세서를 사용하도록 아키텍처 값을 `arm64`로 설정합니다. 기본적으로, 아키텍처 값은 `x86_64`입니다.

# Lambda .zip 배포 패키지 암호화
<a name="encrypt-zip-package"></a>

Lambda에서는 AWS KMS key를 사용하여 .zip 배포 패키지 및 함수 구성 세부 정보에 대해 항상 저장 중 서버 측 암호화를 제공합니다. 기본적으로 Lambda는 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)를 사용합니다. 이 기본 동작이 워크플로에 적합한 경우 다른 작업을 설정하지 않아도 됩니다. AWS에서는 이 키의 사용에 대한 요금을 청구하지 않습니다.

원한다면 AWS KMS 고객 관리형 키를 대신 제공할 수 있습니다. KMS 키의 교체를 제어하거나 KMS 키를 관리하기 위한 조직의 요구 사항을 충족하기 위해 이 작업을 수행할 수 있습니다. 고객 관리형 키를 사용하면 KMS 키에 대한 액세스 권한이 있는 계정의 사용자만 함수의 코드 또는 구성을 보거나 관리할 수 있습니다.

고객 관리형 키에는 표준 AWS KMS 요금이 발생합니다. 자세한 내용은 [AWS Key Management Service 요금](https://aws.amazon.com/kms/pricing/)을 참조하십시오.

## 고객 관리형 키 만들기
<a name="create-key"></a>

 AWS Management Console 또는 AWS KMS API를 사용하여 대칭형 고객 관리형 키를 만들 수 있습니다.

**대칭 고객 관리형 키를 만들려면**

*AWS Key Management Service 개발자 안내서*의 [Creating symmetric encryption Creating symmetric KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)에 나온 단계를 수행합니다.

### 권한
<a name="enable-zip-permissions"></a>

**키 정책**

[키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)에서는 고객 관리형 키에 대한 액세스를 제어합니다. 모든 고객 관리형 키에는 키를 사용할 수 있는 사람과 키를 사용하는 방법을 결정하는 문장이 포함된 정확히 하나의 키 정책이 있어야 합니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [How to change a key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-modifying.html#key-policy-modifying-how-to)를 참조하세요.

고객 관리형 키를 사용하여 .zip 배포 패키지를 암호화하는 경우 Lambda는 키에 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)를 추가하지 않습니다. 대신 AWS KMS 키 정책에서 Lambda가 사용자를 대신하여 다음 AWS KMS API 작업을 직접 호출하도록 허용해야 합니다.
+ [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

다음 예제 키 정책에서는 계정 111122223333의 모든 Lambda 함수가 지정된 고객 관리형 키에 필요한 AWS KMS 작업을 직접 호출하도록 허용합니다.

**Example AWS KMS 키 정책**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringLike": {
                "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:111122223333:function:*"
                }
            }
        }
    ]
}
```

[키 액세스 문제 해결](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html#example-no-iam)에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*를 참조하세요.

**엔터티 권한**

고객 관리형 키를 사용하여 .zip 배포 패키지를 암호화하는 경우 해당 키에 대한 액세스 권한을 보유한 [위탁자](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html)만 .zip 배포 패키지에 액세스할 수 있습니다. 예를 들어 고객 관리형 키에 대한 액세스 권한이 없는 위탁자는 [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) 응답에 포함되어 있는 미리 서명된 S3 URL을 사용하여 .zip 패키지를 다운로드할 수 없습니다. `AccessDeniedException`이 응답의 `Code` 섹션에서 반환됩니다.

**Example AWS KMS AccessDeniedException**  

```
{
    "Code": {
        "RepositoryType": "S3",
        "Error": {
            "ErrorCode": "AccessDeniedException",
            "Message": "KMS access is denied. Check your KMS permissions. KMS Exception: AccessDeniedException KMS Message: User: arn:aws:sts::111122223333:assumed-role/LambdaTestRole/session is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:111122223333:key/key-id with an explicit deny in a resource-based policy"
        },
        "SourceKMSKeyArn": "arn:aws:kms:us-east-1:111122223333:key/key-id"
    },
	...
```

AWS KMS 키 액세스 제어에 대한 자세한 내용은 [Authentication and access control for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/control-access.html)를 참조하세요.

## .zip 배포 패키지에 고객 관리형 키 사용
<a name="enable-zip-custom-encryption"></a>

다음 API 파라미터를 사용하여 .zip 배포 패키지에 대한 고객 관리형 키를 구성합니다.
+ [SourceKMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionCode.html#lambda-Type-FunctionCode-SourceKMSKeyArn): 소스 .zip 배포 패키지(업로드하는 파일)를 암호화합니다.
+ [KMSKeyArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-KMSKeyArn): [환경 변수](configuration-envvars-encryption.md) 및 [Lambda SnapStart](snapstart.md) 스냅샷을 암호화합니다.

`SourceKMSKeyArn` 및 `KMSKeyArn`이 모두 지정되면 Lambda는 `KMSKeyArn` 키를 사용하여 Lambda에서 함수를 간접 호출하는 데 사용하는 패키지의 압축 해제된 버전을 암호화합니다. `SourceKMSKeyArn`이 지정되었지만 `KMSKeyArn`이 지정되지 않은 경우 Lambda는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 패키지의 압축 해제된 버전을 암호화합니다.

------
#### [ Lambda console ]

**함수를 생성하는 경우 고객 관리형 키 암호화를 추가하는 방법**

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

1. **함수 생성**을 선택합니다.

1. **새로 작성(Author from scratch)** 또는 **컨테이너 이미지(Container image)**를 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.

   1. **함수 이름(Function name)**에 함수 이름을 입력합니다.

   1. **런타임**에서 함수에 사용할 언어 버전을 선택합니다.

1. **고급 설정**을 확장하고 **AWS KMS 고객 관리형 키를 사용하여 암호화 활성화**를 선택하세요.

1. 고객 관리형 키를 선택합니다.

1. **함수 생성**을 선택합니다.

고객 관리형 키 암호화를 제거하거나 다른 키를 사용하려면 .zip 배포 패키지를 다시 업로드해야 합니다.

**기존 함수에 고객 관리형 키 암호화를 추가하는 방법**

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

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

1. **코드 소스** 창에서 **에서 업로드**를 선택합니다.

1. **.zip 파일** 또는 **Amazon S3 위치**를 선택하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/upload-zip.png)

1. 파일을 업로드하거나 Amazon S3 위치를 입력하세요.

1. **AWS KMS 고객 관리형 키를 사용하여 암호화 활성화**를 선택하세요.

1. 고객 관리형 키를 선택합니다.

1. **저장**을 선택합니다.

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

**함수를 생성하는 경우 고객 관리형 키 암호화를 추가하는 방법**

다음 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 예제에서:
+ `--code`: .zip 배포 패키지(`ZipFile`)의 로컬 경로와 이를 암호화할 고객 관리형 키(`SourceKMSKeyArn`)를 지정합니다.
+ `--kms-key-arn`: 환경 변수 및 배포 패키지의 압축 해제된 버전을 암호화할 고객 관리형 키를 지정합니다.

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x \
  --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code ZipFile=fileb://myFunction.zip,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

다음 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 예제에서:
+ `--code`: Amazon S3 버킷(`S3Bucket`, `S3Key`, `S3ObjectVersion`)의 .zip 파일 위치와 암호화할 고객 관리형 키(`SourceKMSKeyArn`)를 지정합니다.
+ `--kms-key-arn`: 환경 변수 및 배포 패키지의 압축 해제된 버전을 암호화할 고객 관리형 키를 지정합니다.

```
aws lambda create-function \
  --function-name myFunction \
  --runtime nodejs24.x --handler index.handler \
  --role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
  --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion,SourceKMSKeyArn=arn:aws:kms:us-east-1:111122223333:key/key-id \
  --kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key2-id
```

**기존 함수에 고객 관리형 키 암호화를 추가하는 방법**

다음 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 예제에서:
+ `--zip-file`: .zip 배포 패키지에 대한 로컬 경로를 지정합니다.
+ `--source-kms-key-arn`: 배포 패키지의 압축된 버전을 암호화할 고객 관리형 키를 지정합니다. Lambda에서는 AWS 소유 키를 사용하여 함수 간접 호출을 위해 압축 해제된 패키지를 암호화합니다. 고객 관리형 키를 사용하여 패키지의 압축 해제된 버전을 암호화하려면 `--kms-key-arn` 옵션을 사용하여 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 실행합니다.

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip \
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

다음 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 예제에서:
+ `--s3-bucket`: Amazon S3 버킷에서 .zip 파일의 위치를 지정합니다.
+ `--s3-key`: 배포 패키지의 Amazon S3 키를 지정합니다.
+ `--s3-object-version`: 버전이 지정된 객체의 경우 사용할 배포 패키지 객체의 버전.
+ `--source-kms-key-arn`: 배포 패키지의 압축된 버전을 암호화할 고객 관리형 키를 지정합니다. Lambda에서는 AWS 소유 키를 사용하여 함수 간접 호출을 위해 압축 해제된 패키지를 암호화합니다. 고객 관리형 키를 사용하여 패키지의 압축 해제된 버전을 암호화하려면 `--kms-key-arn` 옵션을 사용하여 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 실행합니다.

```
aws lambda update-function-code \
  --function-name myFunction \
  --s3-bucket amzn-s3-demo-bucket \
  --s3-key myFileName.zip \
  --s3-object-version myObject Version
  --source-kms-key-arn arn:aws:kms:us-east-1:111122223333:key/key-id
```

**기존 함수에서 고객 관리형 키 암호화를 제거하는 방법**

다음 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 예제에서는 `--zip-file`은 .zip 배포 패키지에 대한 로컬 경로를 지정합니다. `--source-kms-key-arn` 옵션 없이 이 명령을 실행하는 경우 Lambda는 AWS 소유 키를 사용하여 배포 패키지의 압축된 버전을 암호화합니다.

```
aws lambda update-function-code \
  --function-name myFunction \
  --zip-file fileb://myFunction.zip
```

------

# 컨테이너 이미지를 사용하여 Lambda 함수 생성
<a name="images-create"></a>

AWS Lambda 함수의 코드는 스크립트 또는 컴파일된 프로그램과 해당 종속 항목으로 구성됩니다. 함수 코드는 *배포 패키지*를 사용하여 Lambda에 배포합니다. Lambda는 컨테이너 이미지 및 .zip 파일 아카이브의 두 가지 배포 패키지를 지원합니다.

Lambda 함수의 컨테이너 이미지를 빌드하는 세 가지 방법이 있습니다.
+ [Lambda용 AWS 기본 이미지 사용](#runtimes-images-lp)

  [AWS 기본 이미지](#runtimes-images-lp)에는 언어 런타임, Lambda와 함수 코드 간의 상호 작용을 관리하는 런타임 인터페이스 클라이언트 및 로컬 테스트를 위한 런타임 인터페이스 에뮬레이터가 미리 로드되어 있습니다.
+ [AWS OS 전용 기본 이미지 사용](#runtimes-images-provided)

  [AWS OS 전용 기본 이미지](https://gallery.ecr.aws/lambda/provided)는 Amazon Linux 배포판 및 [런타임 인터페이스 에뮬레이터](https://github.com/aws/aws-lambda-runtime-interface-emulator/)를 포함합니다. 이러한 이미지는 일반적으로 [Go](go-image.md#go-image-provided) 및 [Rust](lambda-rust.md)와 같은 컴파일된 언어의 컨테이너 이미지와 Lambda가 기본 이미지를 제공하지 않는 언어 또는 언어 버전(예: Node.js 19)의 컨테이너 이미지를 생성하는 데 사용됩니다. OS 전용 기본 이미지를 사용하여 [사용자 지정 런타임](runtimes-custom.md)을 구현할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 해당 언어용 [런타임 인터페이스 클라이언트](#images-ric)를 이미지에 포함해야 합니다.
+ [비 AWS 기본 이미지 사용](#images-types)

  Alpine Linux, Debian 등의 다른 컨테이너 레지스트리의 대체 기본 이미지를 사용할 수 있습니다. 조직에서 생성한 사용자 지정 이미지를 사용할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 해당 언어용 [런타임 인터페이스 클라이언트](#images-ric)를 이미지에 포함해야 합니다.

**작은 정보**  
Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 [다단계 빌드 사용](https://docs.docker.com/build/building/multi-stage/)을 참조하세요. 효율적인 컨테이너 이미지를 빌드하려면 [Dockerfile 작성 모범 사례](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)를 따르세요.

컨테이너 이미지에서 Lambda 함수를 생성하려면 이미지를 로컬에서 빌드하고 Amazon Elastic Container Registry(Amazon ECR) 리포지토리에 업로드합니다. [AWS Marketplace](https://docs.aws.amazon.com/marketplace/latest/userguide/container-based-products.html) 판매자가 제공한 컨테이너 이미지를 사용하는 경우 먼저 프라이빗 Amazon ECR 리포지토리에 이미지를 복제해야 합니다. 그런 다음 함수를 생성할 때 리포지토리 URI를 지정합니다. Amazon ECR 리포지토리는 Lambda 함수와 동일한 AWS 리전 내에 있어야 합니다. 이미지가 Lambda 함수와 동일한 리전에 있는 한 다른 AWS 계정의 이미지를 사용하여 함수를 생성할 수 있습니다. 자세한 내용은 [Amazon ECR 교차 계정 권한](#configuration-images-xaccount-permissions) 섹션을 참조하세요.

**참고**  
Lambda는 컨테이너 이미지에 대해 Amazon ECR FIPS 엔드포인트를 지원하지 않습니다. 리포지토리 URI에 `ecr-fips`가 포함된 경우 FIPS 엔드포인트를 사용하고 있는 것입니다. 예시: `111122223333.dkr.ecr-fips.us-east-1.amazonaws.com`.

이 페이지에서는 Lambda 호환 컨테이너 이미지 생성을 위한 기본 이미지 유형과 요구 사항을 설명합니다.

**참고**  
기존 함수의 [배포 패키지 유형](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType)(.zip 또는 컨테이너 이미지)은 변경할 수 없습니다. 예를 들어 .zip 파일 아카이브를 사용하도록 컨테이너 이미지 함수를 변환할 수는 없습니다. 새로운 함수를 생성해야 합니다.

**Topics**
+ [요구 사항](#images-reqs)
+ [Lambda용 AWS 기본 이미지 사용](#runtimes-images-lp)
+ [AWS OS 전용 기본 이미지 사용](#runtimes-images-provided)
+ [비 AWS 기본 이미지 사용](#images-types)
+ [런타임 인터페이스 클라이언트](#images-ric)
+ [Amazon ECR 권한](#gettingstarted-images-permissions)
+ [함수 수명 주기](#images-lifecycle)

## 요구 사항
<a name="images-reqs"></a>

[AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)와 [Docker CLI](https://docs.docker.com/get-docker)를 설치합니다. 또한 다음 요구 사항에 유의하세요.
+ 컨테이너 이미지는 [사용자 지정 런타임을 위한 Lambda 런타임 API 사용](runtimes-api.md)를 구현해야 합니다. AWS 오픈 소스 [런타임 인터페이스 클라이언트](#images-ric)는 이 API를 구현합니다. 런타임 인터페이스 클라이언트를 선호하는 기본 이미지에 추가하여 Lambda와 호환되도록 만들 수 있습니다.
+ 컨테이너 이미지는 읽기 전용 파일 시스템에서 실행할 수 있어야 합니다. 함수 코드는 512MB에서 10,240MB 사이의 스토리지가 있는 쓰기 가능한 `/tmp` 디렉터리에 1MB 단위로 액세스할 수 있습니다.
+ 기본 Lambda 사용자는 함수 코드를 실행하는 데 필요한 모든 파일을 읽을 수 있어야 합니다. Lambda는 권한이 최소 권한인 기본 Linux 사용자를 정의하여 보안 모범 사례를 따릅니다. 즉, Dockerfile에서 [USER](https://docs.docker.com/reference/dockerfile/#user)를 지정할 필요가 없습니다. 애플리케이션 코드가 다른 Linux 사용자의 실행이 제한된 파일에 의존하지 않는지 확인합니다.
+ Lambda는 Linux 기반 컨테이너 이미지만 지원합니다.
+ Lambda는 다중 아키텍처 기본 이미지를 제공합니다. 하지만 함수에 대해 빌드하는 이미지는 아키텍처 중 하나만 대상으로 해야 합니다. Lambda는 다중 아키텍처 컨테이너 이미지를 사용하는 함수를 지원하지 않습니다.

## Lambda용 AWS 기본 이미지 사용
<a name="runtimes-images-lp"></a>

Lambda용 [AWS 기본 이미지](https://gallery.ecr.aws/lambda/) 중 하나를 사용하여 함수 코드의 컨테이너 이미지를 빌드할 수 있습니다. 기본 이미지는 Lambda에서 컨테이너 이미지를 실행하는 데 필요한 언어 런타임 및 기타 구성 요소가 미리 로드되어 있습니다. 함수 코드와 종속 항목을 기본 이미지에 추가한 다음 컨테이너 이미지로 패키징합니다.

AWS는 Lambda용 AWS 기본 이미지를 주기적으로 업데이트합니다. Dockerfile의 FROM 속성에 이미지 이름이 포함되어 있으면 Docker 클라이언트는 [Amazon ECR 리포지토리](https://gallery.ecr.aws/lambda/)에서 최신 버전의 이미지를 가져옵니다. 업데이트된 기본 이미지를 사용하려면 컨테이너 이미지를 다시 빌드하고 [함수 코드를 업데이트](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)해야 합니다.

Node.js 20, Python 3.12, Java 21, .NET 8, Ruby 3.3 이상의 기본 이미지는 [Amazon Linux 2023 최소 컨테이너 이미지](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html)를 기반으로 합니다. 이전 기본 이미지는 Amazon Linux 2를 사용합니다. AL2023은 작은 배포 공간과 `glibc`와 같이 업데이트된 라이브러리 버전을 포함하여 Amazon Linux 2에 비해 여러 가지 이점을 제공합니다.

AL2023 기반 이미지는 `microdnf`(`dnf` 심볼릭 링크)를 Amazon Linux 2에서 기본 패키지 관리자인 `yum` 대신 패키지 관리자로 사용합니다. `microdnf`는 `dnf`의 독립 실행형 구현입니다. AL2023 기반 이미지에 포함된 패키지 목록의 경우 [Comparing packages installed on Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html)의 **Minimal Container** 열을 참조하세요. AL2023과 Amazon Linux 2의 차이점에 대한 자세한 내용은 AWS 컴퓨팅 블로그의 [Introducing the Amazon Linux 2023 runtime for AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)를 참조하세요.

**참고**  
AWS Serverless Application Model(AWS SAM)을 포함하여 AL2023 기반 이미지를 로컬에서 실행하려면 Docker 버전 20.10.10 이상을 사용해야 합니다.

AWS 기본 이미지를 사용하여 컨테이너 이미지를 빌드하려면 선호하는 언어에 대한 지침을 선택합니다.
+ [Node.js](nodejs-image.md#nodejs-image-instructions)
+ [TypeScript](typescript-image.md#base-image-typescript)(Node.js 기본 이미지 사용)
+ [Python](python-image.md#python-image-instructions)
+ [Java](java-image.md#java-image-instructions) 
+ [Go](go-image.md#go-image-provided)
+ [.NET](csharp-image.md#csharp-image-instructions)
+ [Ruby](ruby-image.md#ruby-image-instructions)

## AWS OS 전용 기본 이미지 사용
<a name="runtimes-images-provided"></a>

[AWS OS 전용 기본 이미지](https://gallery.ecr.aws/lambda/provided)는 Amazon Linux 배포판 및 [런타임 인터페이스 에뮬레이터](https://github.com/aws/aws-lambda-runtime-interface-emulator/)를 포함합니다. 이러한 이미지는 일반적으로 [Go](go-image.md#go-image-provided) 및 [Rust](lambda-rust.md)와 같은 컴파일된 언어의 컨테이너 이미지와 Lambda가 기본 이미지를 제공하지 않는 언어 또는 언어 버전(예: Node.js 19)의 컨테이너 이미지를 생성하는 데 사용됩니다. OS 전용 기본 이미지를 사용하여 [사용자 지정 런타임](runtimes-custom.md)을 구현할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 해당 언어용 [런타임 인터페이스 클라이언트](#images-ric)를 이미지에 포함해야 합니다.


| Tags | 런타임 | 운영 체제 | Dockerfile | 사용 중단 | 
| --- | --- | --- | --- | --- | 
| al2023 | OS 전용 런타임 | Amazon Linux 2023 | [GitHub의 OS 전용 런타임용 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/provided.al2023/Dockerfile.provided.al2023) |   2029년 6월 30일   | 
| al2 | OS 전용 런타임 | Amazon Linux 2 | [GitHub의 OS 전용 런타임용 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/provided.al2/Dockerfile.provided.al2) |   2026년 7월 31일   | 

Amazon Elastic Container Registry 퍼블릭 갤러리: [gallery.ecr.aws/lambda/provided](https://gallery.ecr.aws/lambda/provided)

## 비 AWS 기본 이미지 사용
<a name="images-types"></a>

Lambda는 다음 이미지 매니페스트 형식 중 하나에 부합하는 모든 이미지를 지원합니다.
+ Docker 이미지 매니페스트 V2, 스키마 2(Docker 버전 1.10 이상에서 사용됨)
+ Open Container Initiative(OCI) 사양(v1.0.0 이상)

Lambda는 모든 레이어를 포함한 최대 10GB의 비압축 이미지 크기를 지원합니다.

**참고**  
이미지가 Lambda와 호환되도록 하려면 해당 언어용 [런타임 인터페이스 클라이언트](#images-ric)를 이미지에 포함해야 합니다.
최적의 성능을 위해 이미지 매니페스트 크기를 25,400바이트 미만으로 유지합니다. 이미지 매니페스트 크기를 줄이려면 이미지의 계층 수를 최소화하고 주석을 줄입니다.

## 런타임 인터페이스 클라이언트
<a name="images-ric"></a>

[OS 전용 기본 이미지](#runtimes-images-provided)나 대체 기본 이미지를 사용하는 경우 이미지에 런타임 인터페이스 클라이언트를 포함해야 합니다. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 간의 상호 작용을 관리하는 [사용자 지정 런타임을 위한 Lambda 런타임 API 사용](runtimes-api.md)를 확장해야 합니다. AWS는 다음 언어에 대한 오픈 소스 런타임 인터페이스 클라이언트를 제공합니다.
+  [Node.js](nodejs-image.md#nodejs-image-clients) 
+  [Python](python-image.md#python-image-clients) 
+  [Java](java-image.md#java-image-clients) 
+  [.NET](csharp-image.md#csharp-image-clients) 
+  [Go](go-image.md#go-image-clients) 
+  [Ruby](ruby-image.md#ruby-image-clients) 
+  [Rust](lambda-rust.md) – 

AWS에서 제공하는 런타임 인터페이스 클라이언트가 없는 언어를 사용하는 경우 직접 생성해야 합니다.

## Amazon ECR 권한
<a name="gettingstarted-images-permissions"></a>

컨테이너 이미지에서 Lambda 함수를 생성하기 전에 이미지를 로컬로 빌드하고 Amazon ECR 리포지토리에 업로드해야 합니다. 함수를 생성할 때 Amazon ECR 리포지토리 URI를 지정합니다.

함수를 생성하는 사용자 또는 역할에 대한 권한에 `GetRepositoryPolicy`, `SetRepositoryPolicy`, `BatchGetImage`, `GetDownloadUrlForLayer`가 포함되어 있는지 확인합니다.

예를 들어 IAM 콘솔을 사용하여 다음 정책을 포함하는 역할을 생성합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ecr:SetRepositoryPolicy",
        "ecr:GetRepositoryPolicy",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world"
    }
  ]
}
```

------

### Amazon ECR 리포지토리 정책
<a name="configuration-images-permissions"></a>

Amazon ECR의 컨테이너 이미지와 동일한 계정의 함수에 대해 Amazon ECR 리포지토리 정책에 `ecr:BatchGetImage` 및 `ecr:GetDownloadUrlForLayer` 권한을 추가할 수 있습니다. 다음 예제는 최소한의 정책을 보여줍니다.

```
{
        "Sid": "LambdaECRImageRetrievalPolicy",
        "Effect": "Allow",
        "Principal": {
          "Service": "lambda.amazonaws.com"
        },
        "Action": [
          "ecr:BatchGetImage",
          "ecr:GetDownloadUrlForLayer"
        ]
    }
```

Amazon ECR 리포지토리 권한에 대한 자세한 내용은 Amazon Elastic Container Registry 사용 설명서**의 [프라이빗 리포지토리 정책](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policies.html)을 참조하세요.

Amazon ECR 리포지토리에 이러한 권한이 포함되지 않은 경우 Lambda에서 자동으로 권한 추가를 시도합니다. Lambda를 직접적으로 호출하는 위탁자가 `ecr:getRepositoryPolicy` 및 `ecr:setRepositoryPolicy` 권한을 갖고 있는 경우에만 Lambda가 권한을 추가할 수 있습니다.

Amazon ECR 리포지토리 권한을 보거나 편집하려면 Amazon Elastic Container Registry 사용 설명서**의 [프라이빗 리포지토리 정책 설명 설정](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)의 지침을 따르면 됩니다.

#### Amazon ECR 교차 계정 권한
<a name="configuration-images-xaccount-permissions"></a>

동일한 리전의 다른 계정은 사용자 계정이 소유한 컨테이너 이미지를 사용하는 함수를 생성할 수 있습니다. 다음 예제에서 [Amazon ECR 리포지토리 권한 정책](https://docs.aws.amazon.com/AmazonECR/latest/userguide/set-repository-policy.html)은 계정 번호 123456789012에 대한 액세스 권한을 부여하는 다음 문이 필요합니다.
+ **CrossAccountPermission** - 계정 123456789012가 이 ECR 리포지토리의 이미지를 사용하는 Lambda 함수를 생성하고 업데이트하도록 허용합니다.
+ **LambdaECRImageCrossAccountRetrievalPolicy** - Lambda는 장기간 간접 호출되지 않는 경우 결국 함수의 상태를 비활성으로 설정합니다. 이 문은 Lambda가 123456789012가 소유한 함수를 대신하여 최적화 및 캐싱을 위해 컨테이너 이미지를 검색할 수 있도록 하는 데 필요합니다.

**Example - 리포지토리에 교차 계정 권한 추가**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CrossAccountPermission",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/example-lambda-repository"
    },
    {
      "Sid": "LambdaECRImageCrossAccountRetrievalPolicy",
      "Effect": "Allow",
      "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Condition": {
        "ArnLike": {
          "aws:sourceARN": "arn:aws:lambda:us-east-1:123456789012:function:*"
        }
      },
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/example-lambda-repository"
    }
  ]
}
```

여러 계정에 대한 액세스 권한을 부여하려면 `CrossAccountPermission` 정책의 위탁자 목록과 `LambdaECRImageCrossAccountRetrievalPolicy`의 조건 평가 목록에 계정 ID를 추가합니다.

AWS 조직의 여러 계정으로 작업하는 경우 ECR 권한 정책에서 각 계정 ID를 열거하는 것이 좋습니다. 이 접근 방식은 IAM 정책에서 제한된 권한을 설정하는 AWS 보안 모범 사례와 일치합니다.

Lambda 권한 외에도 함수를 생성하는 사용자 또는 역할에는 `BatchGetImage` 및 `GetDownloadUrlForLayer` 권한도 있어야 합니다.

## 함수 수명 주기
<a name="images-lifecycle"></a>

새 컨테이너 이미지 또는 업데이트된 컨테이너 이미지를 업로드하면 함수가 호출을 처리하기 전에 Lambda가 이미지를 최적화합니다. 최적화 프로세스에는 몇 초가 걸릴 수 있습니다. 상태가 `Active`(으)로 변경되면 이 프로세스가 완료될 때까지 함수는 `Pending` 상태로 유지됩니다. 함수가 `Active` 상태에 도달할 때까지 간접적으로 호출할 수 없습니다.

함수가 여러 주 동안 간접 호출되지 않으면 Lambda는 최적화된 버전을 회수하고 함수는 `Inactive` 상태로 전환됩니다. 함수를 다시 활성화하려면 함수를 간접 호출해야 합니다. Lambda는 첫 번째 호출을 거부하고, Lambda가 이미지를 다시 최적화할 때까지 함수는 `Pending` 상태가 됩니다. 그런 다음 함수는 `Active` 상태로 돌아갑니다.

Lambda는 Amazon ECR 리포지토리에서 연관된 컨테이너 이미지를 주기적으로 가져옵니다. 해당 컨테이너 이미지가 더 이상 Amazon ECR에 존재하지 않거나 권한이 취소되면, 함수가 `Failed` 상태에 들어가고 모든 함수 호출에 대해 Lambda가 실패를 반환합니다.

Lambda API를 사용하여 함수 상태에 대한 정보를 가져올 수 있습니다. 자세한 내용은 [Lambda 함수 상태](functions-states.md) 섹션을 참조하세요.

# Lambda 함수 메모리 구성
<a name="configuration-memory"></a>

Lambda는 구성된 메모리 크기에 비례하여 CPU 처리능력을 할당합니다. *메모리*는 런타임에 Lambda 함수가 사용할 수 있는 메모리 양입니다. **메모리** 설정을 사용하면 함수에 할당된 메모리 및 CPU 성능을 늘리거나 줄일 수 있습니다. 메모리는 128MB에서 10,240MB 사이에서 1MB 단위로 구성할 수 있습니다. 1,769MB에서 함수는 하나의 vCPU와 동등한 값을 갖습니다(초당 하나의 vCPU-초 크레딧).

이 페이지에서는 Lambda 함수의 메모리 설정을 업데이트하는 경우와 방법을 설명합니다.

**Topics**
+ [Lambda 함수에 대한 적절한 메모리 설정을 결정합니다.](#configuration-memory-use-cases)
+ [함수 메모리 구성(콘솔)](#configuration-memory-console)
+ [함수 메모리 구성(AWS CLI)](#configuration-memory-cli)
+ [함수 메모리 구성(AWS SAM)](#configuration-memory-sam)
+ [함수 메모리 권장 사항 수락(콘솔)](#configuration-memory-optimization-accept)

## Lambda 함수에 대한 적절한 메모리 설정을 결정합니다.
<a name="configuration-memory-use-cases"></a>

메모리는 함수의 성능을 제어하는 주요 수단입니다. 기본 설정인 128MB는 가능한 가장 낮은 설정입니다. 이벤트를 변환하고 다른 AWS 서비스로 라우팅하는 함수와 같은 간단한 Lambda 함수에는 128MB만 사용하는 것이 좋습니다. 메모리를 더 많이 할당하면 가져온 라이브러리, [Lambda 계층](chapter-layers.md), Amazon Simple Storage Service(Amazon S3) 또는 Amazon Elastic File System(Amazon EFS)을 사용하는 함수의 성능이 향상될 수 있습니다. 메모리를 더 추가하면 그에 비례하여 CPU 양도 증가하여 사용 가능한 전체 컴퓨팅 파워가 증가합니다. 함수가 CPU, 네트워크 또는 메모리 바인딩인 경우 메모리 설정을 늘리면 성능이 크게 향상될 수 있습니다.

올바른 메모리 구성을 찾으려면 Amazon CloudWatch를 사용하여 함수를 모니터링하고 메모리 소비가 구성된 최대값에 근접하는 경우 경보를 설정합니다. 이 경우 메모리 경계 함수를 식별하는 데 도움이 될 수 있습니다. CPU 경계 및 IO 경계 함수의 경우 지속 시간을 모니터링하면 더 많은 인사이트를 얻을 수 있습니다. 이러한 경우 메모리를 늘리면 컴퓨팅 또는 네트워크 병목 현상을 해결할 수 있습니다.

오픈 소스 [AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) 도구 사용을 고려할 수도 있습니다. 이 도구는 AWS Step Functions를 사용하여 서로 다른 메모리 할당에서 Lambda 함수의 여러 동시 버전을 실행하고 성능을 측정합니다. 입력 함수는 AWS 계정에서 실행되어 라이브 HTTP 호출 및 SDK 상호 작용을 수행하고 라이브 프로덕션 시나리오에서 예상 성능을 측정합니다. 또한 이 도구를 사용하도록 CI/CD 프로세스를 구현하여 배포한 새 기능의 성능을 자동으로 측정할 수 있습니다.

## 함수 메모리 구성(콘솔)
<a name="configuration-memory-console"></a>

Lambda 콘솔에서 함수의 메모리를 구성할 수 있습니다.

**함수의 메모리를 업데이트하려면**

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

1. 함수를 선택합니다.

1. **구성** 탭을 선택한 다음 **일반 구성**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/configuration-tab.png)

1. **일반 구성**에서 **편집**을 선택합니다.

1. **메모리**에 128MB에서 10,240MB 사이의 값을 설정합니다.

1. **저장**을 선택합니다.

## 함수 메모리 구성(AWS CLI)
<a name="configuration-memory-cli"></a>

[update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 사용하여 함수의 메모리를 구성할 수 있습니다.

**Example**  

```
aws lambda update-function-configuration \
  --function-name my-function \
  --memory-size 1024
```

## 함수 메모리 구성(AWS SAM)
<a name="configuration-memory-sam"></a>

[AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html )을 사용하여 함수의 메모리를 구성할 수 있습니다. `template.yaml` 파일의 [MemorySize](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-memorysize) 속성을 업데이트한 다음 [sam deploy](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)를 실행합니다.

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 1024
      # Other function properties...
```

## 함수 메모리 권장 사항 수락(콘솔)
<a name="configuration-memory-optimization-accept"></a>

AWS Identity and Access Management(IAM)의 관리자 권한이 있는 경우 AWS Compute Optimizer에서 Lambda 함수 메모리 설정 권장 사항을 수신하도록 옵트인할 수 있습니다. 계정 또는 조직에 대한 메모리 권장 사항을 옵트인하는 방법에 대한 지침은 *AWS Compute Optimizer 사용 설명서*의 [계정 옵트인](https://docs.aws.amazon.com/compute-optimizer/latest/ug/getting-started.html#account-opt-in)을 참조하세요.

**참고**  
Compute Optimizer는 x86\$164 아키텍처를 사용하는 함수만 지원합니다.

옵트인한 상태에서 [Lambda 함수가 Compute Optimizer 요구 사항을 충족](https://docs.aws.amazon.com/compute-optimizer/latest/ug/requirements.html#requirements-lambda-functions)하는 경우 Lambda 콘솔의 **일반 구성**에서 Compute Optimizer의 함수 메모리 권장 사항을 보고 수락할 수 있습니다.

# Lambda 함수에 대한 임시 스토리지 구성
<a name="configuration-ephemeral-storage"></a>

Lambda는 `/tmp` 디렉터리의 함수를 위한 임시 스토리지를 제공합니다. 이 스토리지는 임시이며 각 실행 환경에 고유합니다. **임시 스토리지** 설정을 사용하여 함수에 할당되는 임시 스토리지의 양을 제어할 수 있습니다. 임시 스토리지는 512MB에서 10,240MB 사이에서 1MB 단위로 구성할 수 있습니다. `/tmp`에 저장된 모든 데이터는 AWS에서 관리되는 키를 사용하여 저장 시 암호화됩니다.

이 페이지에서는 일반적인 사용 사례와 Lambda 함수의 임시 스토리지를 업데이트하는 방법을 설명합니다.

**Topics**
+ [증가된 임시 스토리지에 대한 일반적인 사용 사례](#configuration-ephemeral-storage-use-cases)
+ [임시 스토리지(콘솔) 구성](#configuration-ephemeral-storage-console)
+ [임시 스토리지 구성(AWS CLI)](#configuration-ephemeral-storage-cli)
+ [임시 스토리지 구성(AWS SAM)](#configuration-ephemeral-storage-sam)

## 증가된 임시 스토리지에 대한 일반적인 사용 사례
<a name="configuration-ephemeral-storage-use-cases"></a>

다음은 증가된 임시 스토리지가 이점이 되는 몇 가지 일반적인 사용 사례입니다.
+ **ETL(추출, 변환 및 로드) 작업:** 코드가 중간 계산을 수행하거나 처리를 완료하기 위해 다른 리소스를 다운로드하는 경우 임시 스토리지를 늘립니다. 임시 스토리지가 늘어나면 Lambda 함수에서 더 복잡한 ETL 작업을 실행할 수 있습니다.
+ **기계 학습(ML) 추론:** 많은 추론 작업은 라이브러리 및 모델을 포함한 대용량 참조 데이터 파일에 의존합니다. 임시 스토리지가 더 많으면 Amazon Simple Storage Service(Amazon S3)에서 `/tmp`로 더 큰 모델을 다운로드하여 처리에 사용할 수 있습니다.
+ **데이터 처리:** S3 이벤트에 대한 응답으로 Amazon S3에서 개체를 다운로드하는 워크로드의 경우 `/tmp` 스토리지가 많으면 인메모리 처리를 사용하지 않고도 더 큰 개체를 처리할 수 있습니다. PDF를 생성하거나 미디어를 처리하는 워크로드에도 더 많은 임시 스토리지가 이점이 될 수 있습니다.
+ **그래픽 처리:** 이미지 처리는 Lambda 기반 애플리케이션의 일반적인 사용 사례입니다. 대용량 TIFF 파일 또는 위성 이미지를 처리하는 워크로드의 경우 임시 스토리지가 많을수록 Lambda에서 라이브러리를 사용하고 계산을 수행하기가 더 쉬워집니다.

## 임시 스토리지(콘솔) 구성
<a name="configuration-ephemeral-storage-console"></a>

Lambda 콘솔에서 임시 스토리지를 구성할 수 있습니다.

**함수의 임시 스토리지를 수정하려면**

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

1. 함수를 선택합니다.

1. **구성** 탭을 선택한 다음 **일반 구성**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/configuration-tab.png)

1. **일반 구성**에서 **편집**을 선택합니다.

1. **임시 스토리지** 값을 512MB에서 10,240MB 사이에서 1MB 단위로 설정합니다.

1. **저장**을 선택합니다.

## 임시 스토리지 구성(AWS CLI)
<a name="configuration-ephemeral-storage-cli"></a>

[update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 사용하여 임시 스토리지를 구성할 수 있습니다.

**Example**  

```
aws lambda update-function-configuration \
  --function-name my-function \
  --ephemeral-storage '{"Size": 1024}'
```

## 임시 스토리지 구성(AWS SAM)
<a name="configuration-ephemeral-storage-sam"></a>

[AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html )을 사용하여 함수의 임시 스토리지를 구성할 수 있습니다. `template.yaml` 파일의 [EphemeralStorage](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-ephemeralstorage) 속성을 업데이트한 다음 [sam deploy](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)를 실행합니다.

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      Handler: index.handler
      Runtime: nodejs22.x
      Architectures:
        - x86_64
      EphemeralStorage:
        Size: 10240
      # Other function properties...
```

# Lambda 함수에 대한 명령 세트 아키텍처의 선택 및 구성
<a name="foundation-arch"></a>

 Lambda 함수의 *명령 세트 아키텍처*에 따라 Lambda가 함수를 실행하는 데 사용하는 컴퓨터 프로세서의 유형이 결정됩니다. Lambda는 다음과 같은 명령 세트 아키텍처를 선택할 수 있는 옵션을 제공합니다.
+ arm64 - AWS Graviton2 프로세서에 사용되는 64비트 ARM 아키텍처입니다.
+ x86\$164 - x86 기반 프로세서에 사용되는 64비트 x86 아키텍처입니다.

**참고**  
arm64 아키텍처는 대부분의AWS 리전에서 사용할 수 있습니다. 자세한 내용은 [AWS Lambda요금](https://aws.amazon.com//lambda/pricing/#aws-element-9ccd9262-b656-4d9c-8a72-34ee6b662135)을 참조하세요. 메모리 가격표에서 **Arm Price**(ARN 가격) 탭을 선택한 다음 **Region**(리전) 드롭다운 목록을 열어 Lambda에서 arm64를 지원하는 AWS 리전을 확인합니다.  
arm64 아키텍처를 사용하여 함수를 생성하는 방법의 예는 [AWS Lambda Graviton2 프로세서로 구동되는 AWS 함수](https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/)를 참조하세요.

**Topics**
+ [arm64 아키텍처를 사용하는 데 따른 이점](#foundation-arch-adv)
+ [arm64 아키텍처로 마이그레이션을 위한 요구 사항](#foundation-arch-consider)
+ [arm64 아키텍처와의 함수 코드의 호환성](#foundation-arch-considerations)
+ [arm64 아키텍처로 마이그레이션하는 방법](#foundation-arch-steps)
+ [명령 세트 아키텍처 구성](#foundation-arch-config)

## arm64 아키텍처를 사용하는 데 따른 이점
<a name="foundation-arch-adv"></a>

arm64 아키텍처(AWS Graviton2 프로세서)를 사용하는 Lambda 함수는 x86\$164 아키텍처에서 실행되는 동일한 함수보다 훨씬 우수한 가격 대비 성능을 실현할 수 있습니다. 고성능 컴퓨팅, 비디오 인코딩 및 시뮬레이션 워크로드와 같은 컴퓨팅 집약적 애플리케이션에는 arm64를 사용하는 것이 좋습니다.

Graviton2 CPU는 Neoverse N1 코어를 사용하며 Armv8.2(CRC 및 암호화 확장 포함)와 기타 여러 아키텍처 확장을 지원합니다.

Graviton2는 vCPU당 더 큰 L2 캐시를 제공하여 메모리 읽기 시간을 줄입니다. 따라서 웹 및 모바일 백엔드, 마이크로서비스 및 데이터 처리 시스템의 대기 시간 성능이 향상됩니다. 또한 Graviton2는 향상된 암호화 성능을 제공하며 CPU 기반 기계 학습 추론의 대기 시간을 개선하는 명령 세트를 지원합니다.

AWS Graviton2에 대한 자세한 내용은 [AWS Graviton 프로세서](https://aws.amazon.com/ec2/graviton)를 참조하세요.

## arm64 아키텍처로 마이그레이션을 위한 요구 사항
<a name="foundation-arch-consider"></a>

arm64 아키텍처로 마이그레이션할 Lambda 함수를 선택할 때, 원활한 마이그레이션을 위해 함수가 다음 요구 사항을 충족하는지 확인합니다.
+ 배포 패키지에 사용자가 제어하는 오픈 소스 구성 요소 및 소스 코드만 포함되어 있어 사용자가 마이그레이션에 필요한 모든 업데이트를 수행할 수 있습니다.
+ 함수 코드에 서드 파티 종속 구성 요소가 포함된 경우 각 라이브러리 또는 패키지가 arm64 버전을 제공합니다.

## arm64 아키텍처와의 함수 코드의 호환성
<a name="foundation-arch-considerations"></a>

Lambda 함수 코드는 함수의 명령 세트 아키텍처와 호환되어야 합니다. 함수를 arm64 아키텍처로 마이그레이션하기 전에 현재 함수 코드와 관련해 다음 사항에 유의합니다.
+ 내장된 코드 편집기를 사용하여 함수 코드를 추가한 경우 코드는 수정 없이 두 아키텍처 중 하나에서 실행될 수 있습니다.
+ 함수 코드를 업로드한 경우에는 대상 아키텍처와 호환되는 새 코드를 업로드해야 합니다.
+ 함수가 계층을 사용하는 경우 [각 계층이](adding-layers.md#finding-layer-information) 새로운 아키텍처와 호환되는지 확인합니다. 계층이 호환되지 않는 경우 함수를 편집하여 현재 계층 버전을 호환되는 계층 버전으로 바꿉니다.
+ 함수가 Lambda 확장을 사용하는 경우 각 확장이 새로운 아키텍처와 호환되는지 확인합니다.
+ 함수가 컨테이너 이미지 배포 패키지 유형을 사용하는 경우 함수의 아키텍처와 호환되는 새 컨테이너 이미지를 만들어야 합니다.

## arm64 아키텍처로 마이그레이션하는 방법
<a name="foundation-arch-steps"></a>



Lambda 함수를 arm64 아키텍처로 마이그레이션하려면 다음 단계를 수행하는 것이 좋습니다.

1. 애플리케이션 또는 워크로드의 종속 구성 요소 목록을 작성합니다. 일반적인 종속 구성 요소는 다음과 같습니다.
   + 함수가 사용하는 모든 라이브러리와 패키지
   + 컴파일러, 테스트 제품군, 지속적 통합 및 지속적 전달(CI/CD) 파이프라인, 프로비저닝 도구, 스크립트 등, 함수를 빌드, 배포 및 테스트하는 데 사용하는 도구
   + 프로덕션 환경에서 함수를 모니터링하는 데 사용하는 Lambda 확장 및 서드 파티 도구

1. 각 종속 구성 요소별로 버전을 확인한 다음 arm64 버전을 사용할 수 있는지 확인합니다.

1. 새 환경을 빌드하여 애플리케이션을 마이그레이션합니다.

1. 애플리케이션을 부트스트랩합니다.

1. 애플리케이션을 테스트하고 디버깅합니다.

1. arm64 함수의 성능을 테스트합니다. x86\$164 버전과 성능을 비교합니다.

1. arm64 Lambda 함수를 지원하도록 인프라 파이프라인을 업데이트합니다.

1. 배포를 프로덕션 환경에 스테이징합니다.

   예를 들어 [별칭 라우팅 구성](configuring-alias-routing.md)을 사용하여 함수의 x86 버전과 arm64 버전 간에 트래픽을 분할하고 성능과 대기 시간을 비교합니다.

Java, Go, .NET 및 Python에 대한 언어별 정보를 포함하여 arm64 아키텍처용 코드 환경을 만드는 방법에 대한 자세한 내용은 [AWS Graviton 시작하기](https://github.com/aws/aws-graviton-getting-started) GitHub 리포지토리를 참조하세요.

## 명령 세트 아키텍처 구성
<a name="foundation-arch-config"></a>

Lambda 콘솔, AWS SDK, AWS Command Line Interface(AWS CLI) 또는 CloudFormation을 사용하여 신규 및 기존 Lambda 함수의 명령 세트 아키텍처를 구성할 수 있습니다. 다음 단계에 따라 콘솔에서 기존 Lambda 함수의 명령 세트 아키텍처를 변경합니다.

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

1. 명령 세트 아키텍처를 구성할 함수의 이름을 선택합니다.

1. 기본 **코드** 탭의 **런타임 설정** 섹션에서 **편집**을 선택합니다.

1. **Architecture**(아키텍처)에서 함수에 사용할 명령 세트 아키텍처를 선택합니다.

1. **저장**을 선택합니다.

# Lambda 함수 제한 시간 구성
<a name="configuration-timeout"></a>

Lambda는 제한 시간 이전에 설정된 시간 동안 코드를 실행합니다. *제한 시간*은 Lambda 함수를 실행할 수 있는 최대 시간(초)입니다. 이 설정의 기본값은 3초이지만 1초 단위로 최대 900초(15분)까지 값을 조정할 수 있습니다.

이 페이지에서는 Lambda 함수의 제한 시간 설정을 업데이트하는 경우와 방법을 설명합니다.

**Topics**
+ [Lambda 함수에 대한 적절한 제한 시간 값을 결정합니다.](#configuration-timeout-use-cases)
+ [제한 시간 구성(콘솔)](#configuration-timeout-console)
+ [제한 시간 구성(AWS CLI)](#configuration-timeout-cli)
+ [제한 시간 구성(AWS SAM)](#configuration-timeout-sam)

## Lambda 함수에 대한 적절한 제한 시간 값을 결정합니다.
<a name="configuration-timeout-use-cases"></a>

제한 시간 값이 함수의 평균 지속 시간에 가까울수록 함수가 예기치 않게 시간 초과될 위험이 커집니다. 함수의 지속 시간은 데이터 전송량 및 처리량과 함수가 상호 작용하는 서비스의 지연 시간에 따라 달라질 수 있습니다. 시간 초과의 몇 가지 일반적인 원인은 다음과 같습니다.
+ Amazon Simple Storage Service(Amazon S3)의 다운로드가 평균보다 크거나 시간이 더 걸립니다.
+ 함수가 다른 서비스에 요청을 보내면 응답하는 데 시간이 더 오래 걸립니다.
+ 함수에 제공되는 파라미터가 있으면 함수의 계산 복잡성이 커지므로 호출 시간이 더 오래 걸립니다.

애플리케이션을 테스트할 때 테스트에 데이터의 크기 및 양과 실제 파라미터 값이 정확하게 반영되는지 확인하십시오. 테스트에서는 편의상 작은 샘플을 사용하는 경우가 많지만 워크로드에 대해 합리적으로 예상되는 상한에 존재하는 데이터세트를 사용해야 합니다.

## 제한 시간 구성(콘솔)
<a name="configuration-timeout-console"></a>

Lambda 콘솔에서 함수 제한 시간을 구성할 수 있습니다.

**함수에 대한 제한 시간을 수정하려면 다음을 수행합니다.**

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

1. 함수를 선택합니다.

1. **구성** 탭을 선택한 다음 **일반 구성**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/configuration-tab.png)

1. **일반 구성**에서 **편집**을 선택합니다.

1. **제한 시간**에 1초부터 900초(15분) 사이의 값을 설정합니다.

1. **저장**을 선택합니다.

## 제한 시간 구성(AWS CLI)
<a name="configuration-timeout-cli"></a>

[update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 사용하여 제한 시간 값을 초 단위로 구성할 수 있습니다. 다음 예제 명령에서는 함수 제한 시간을 120초(2분)로 늘립니다.

**Example**  

```
aws lambda update-function-configuration \
  --function-name my-function \
  --timeout 120
```

## 제한 시간 구성(AWS SAM)
<a name="configuration-timeout-sam"></a>

[AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html )을 사용하여 함수의 제한 시간 값을 구성할 수 있습니다. `template.yaml` 파일의 [Timeout](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-timeout) 속성을 업데이트한 다음 [sam deploy](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)를 실행합니다.

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      # Other function properties...
```

# Lambda 지속성 함수 구성
<a name="durable-configuration"></a>

Lambda 함수에 대해 지속성 실행을 활성화하려면 함수를 실행할 수 있는 기간, 상태 데이터가 유지되는 기간 및 필요한 권한을 제어하는 특정 설정을 구성해야 합니다.

## 지속성 실행 활성화
<a name="durable-config-settings"></a>

Lambda 함수에 대해 지속성 실행을 활성화하려면 함수 구성에서 `DurableConfig`를 구성합니다. 이 설정은 실행 제한 시간, 상태 보존 및 버전 관리 동작을 제어합니다.

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

```
aws lambda update-function-configuration \
  --function-name my-durable-function \
  --durable-config '{
    "ExecutionTimeout": 3600,
    "RetentionPeriodInDays": 30,
    "AllowInvokeLatest": true
  }'
```

------
#### [ CloudFormation ]

```
Resources:
  MyDurableFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-durable-function
      Runtime: nodejs18.x
      Handler: index.handler
      Code:
        ZipFile: |
          // Your durable function code
      DurableConfig:
        ExecutionTimeout: 3600
        RetentionPeriodInDays: 30
        AllowInvokeLatest: true
```

------

**구성 파라미터:**
+ `ExecutionTimeout` - 초 단위의 최대 실행 시간(최대 31,536,000(1년))
+ `RetentionPeriodInDays` - 실행 상태 및 내역을 유지하는 기간(1\$1365일)
+ `AllowInvokeLatest` - 지속성 실행을 위해 \$1LATEST 버전의 간접 호출을 허용하는지 여부

## 지속성 함수에 대한 IAM 권한
<a name="durable-iam-permissions"></a>

지속성 함수에는 표준 Lambda 실행 역할 이외의 추가 IAM 권한이 필요합니다. 함수의 실행 역할에는 상태 관리 및 지속성 실행 API에 대한 권한이 포함되어야 합니다.

**최소 필수 권한:**

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:InvokeFunction",
        "lambda:GetFunction",
        "lambda:ManageDurableState",
        "lambda:GetDurableExecution",
        "lambda:ListDurableExecutions"
      ],
      "Resource": "arn:aws:lambda:*:*:function:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    }
  ]
}
```

**CloudFormation 실행 역할 예제:**

```
DurableFunctionRole:
  Type: AWS::IAM::Role
  Properties:
    AssumeRolePolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole
    ManagedPolicyArns:
      - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
    Policies:
      - PolicyName: DurableFunctionPolicy
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - lambda:ManageDurableState
                - lambda:GetDurableExecution
                - lambda:ListDurableExecutions
              Resource: '*'
```

## 구성 모범 사례
<a name="durable-config-best-practices"></a>

프로덕션용으로 지속성 함수 구성 시 다음 모범 사례를 따릅니다.
+ **적절한 실행 제한 시간 설정** - 워크플로의 최대 예상 기간에 따라 `ExecutionTimeout`을 구성합니다. 제한 시간이 불필요하게 길면 비용 및 리소스 할당에 영향을 미치므로, 너무 길게 설정하지 마세요.
+ **보존과 스토리지 비용의 균형 유지** - 디버깅 및 감사 요구 사항에 따라 `RetentionPeriodInDays`를 설정합니다. 보존 기간이 길수록 스토리지 비용이 증가합니다.
+ **프로덕션 환경에서 버전 관리 사용** - 프로덕션 환경에서 `AllowInvokeLatest`를 `false`로 설정하고 지속성 실행에 특정 함수 버전 또는 별칭을 사용합니다.
+ **상태 크기 모니터링** - 상태 객체가 크면 스토리지 비용이 증가하고 성능에 영향을 미칠 수 있습니다. 상태 크기를 최소화하고 대용량 데이터에는 외부 스토리지를 사용하세요.
+ **적절한 로깅 구성** - 장기 실행 워크플로 문제를 해결하기 위해 세부 로깅을 활성화하되, 로그 볼륨과 비용에 유의합니다.

**프로덕션 구성 예제:**

```
{
  "ExecutionTimeout": 86400,
  "RetentionPeriodInDays": 7,
  "AllowInvokeLatest": false
}
```

# Lambda 환경 변수 작업
<a name="configuration-envvars"></a>

환경 변수를 사용하면 코드를 업데이트하지 않고도 함수의 동작을 조정할 수 있습니다. 환경 변수는 함수의 버전별 구성에 저장된 문자열 쌍입니다. Lambda 런타임은 코드에 환경 변수를 사용할 수 있게 하고 함수 및 호출 요청에 대한 정보가 포함된 추가 환경 변수를 설정합니다.

**참고**  
보안을 강화하려면 환경 변수 대신 AWS Secrets Manager를 사용하여 데이터베이스 자격 증명과 API 키 또는 권한 부여 토큰과 같은 기타 민감한 정보를 저장하는 것이 좋습니다. 자세한 내용은 [Lambda 함수에서 Secrets Manager 보안 암호 사용](with-secrets-manager.md) 섹션을 참조하세요.

환경 변수는 함수 간접 호출 전에 평가되지 않습니다. 정의한 모든 값은 리터럴 문자열로 간주되며 확장되지 않습니다. 함수 코드에서 변수 평가를 수행합니다.

## Lambda 환경 변수 생성
<a name="create-environment-variables"></a>

Lambda 콘솔, AWS Command Line Interface(AWS CLI), AWS Serverless Application Model(AWS SAM) 또는 AWS SDK를 사용하여 Lambda에서 환경 변수를 구성할 수 있습니다.

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

게시되지 않은 함수 버전에서 환경 변수를 정의합니다. 버전을 게시할 때 환경 변수는 다른 [버전별 구성 설정](configuration-versions.md)과 함께 해당 버전에 대해 잠금 상태가 됩니다.

키와 값을 정의하여 함수에 환경 변수를 생성합니다. 함수는 키 이름을 사용하여 환경 변수 값을 검색합니다.

**Lambda 콘솔에서 환경 변수를 설정하려면**

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

1. 함수를 선택합니다.

1. **구성** 탭을 선택하고 **환경 변수**를 선택하세요.

1. **Environment variables(환경 변수)**에서 **편집**을 선택합니다.

1. **Add environment variable(환경 변수 추가)**을 선택합니다.

1. 키와 값을 입력합니다.

**요구 사항**
   + 키는 문자로 시작되며 최소 2자입니다.
   + 키에는 문자, 숫자 및 밑줄(`_`)만 포함됩니다.
   + 키는 [Lambda에 의해 예약](#configuration-envvars-runtime)되지 않습니다.
   + 모든 환경 변수의 총 크기는 4KB를 초과하지 않습니다.

1. **저장**을 선택합니다.

**콘솔 코드 편집기에서 환경 변수 목록을 생성하려면**

Lambda 코드 편집기에서 환경 변수 목록을 생성할 수 있습니다. 이는 코딩하는 동안 환경 변수를 빠르게 참조할 수 있는 방법입니다.

1. **코드** 탭을 선택합니다.

1. 아래로 스크롤하여 코드 편집기의 **환경 변수** 섹션으로 이동하세요. 기존 환경 변수가 여기에 나열됩니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/env-var.png)

1. 새 환경 변수를 생성하려면 더하기 기호(![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/add-plus.png))를 선택하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/create-env-var.png)

콘솔 코드 편집기에 나열되어 있는 환경 변수는 암호화된 상태로 유지됩니다. 전송 중 암호화에 대해 암호화 도우미를 활성화한 경우 해당 설정은 변경되지 않습니다. 자세한 내용은 [Lambda 환경 변수 보안](configuration-envvars-encryption.md) 섹션을 참조하세요.

환경 변수 목록은 읽기 전용이며 Lambda 콘솔에서만 사용할 수 있습니다. 이 파일은 함수의 .zip 파일 아카이브를 다운로드할 때 포함되지 않으며, 이 파일을 업로드하여 환경 변수를 추가할 수 없습니다.

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

다음 예제에서는 `my-function`라는 함수에서 두 개의 환경 변수를 설정합니다 .

```
aws lambda update-function-configuration \
  --function-name my-function \
  --environment "Variables={BUCKET=amzn-s3-demo-bucket,KEY=file.txt}"
```

`update-function-configuration` 명령을 사용하여 환경 변수를 적용하면 `Variables` 구조의 전체 내용이 바뀝니다. 새 환경 변수를 추가할 때 기존 환경 변수를 유지하려면 요청에 기존 값을 모두 포함시킵니다.

현재 구성을 가져오려면 `get-function-configuration` 명령을 사용합니다.

```
aws lambda get-function-configuration \
  --function-name my-function
```

다음 결과가 표시됩니다.

```
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-2:111122223333:function:my-function",
    "Runtime": "nodejs24.x",
    "Role": "arn:aws:iam::111122223333:role/lambda-role",
    "Environment": {
        "Variables": {
            "BUCKET": "amzn-s3-demo-bucket",
            "KEY": "file.txt"
        }
    },
    "RevisionId": "0894d3c1-2a3d-4d48-bf7f-abade99f3c15",
    ...
}
```

`get-function-configuration` 출력의 개정 ID를 파라미터로 `update-function-configuration`에 전달할 수 있습니다. 이렇게 하면 구성을 읽을 때와 업데이트할 때 사이에 값이 변경되지 않습니다.

함수의 암호화 키를 구성하려면 `KMSKeyARN` 옵션을 설정합니다.

```
aws lambda update-function-configuration \
  --function-name my-function \
  --kms-key-arn arn:aws:kms:us-east-2:111122223333:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

------
#### [ AWS SAM ]

[AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/serverless-getting-started.html )을 사용하여 함수에 대한 환경 변수를 구성할 수 있습니다. `template.yaml` 파일의 [환경](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-environment) 및 [변수](https://docs.aws.amazon.com//AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-environment.html#cfn-lambda-function-environment-variables) 속성을 업데이트한 다음 [sam deploy](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html)를 실행합니다.

**Example template.yaml**  

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application Model template describing your function.
Resources:
  my-function:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Description: ''
      MemorySize: 128
      Timeout: 120
      Handler: index.handler
      Runtime: nodejs24.x
      Architectures:
        - x86_64
      EphemeralStorage:
        Size: 10240
      Environment:
        Variables:
          BUCKET: amzn-s3-demo-bucket
          KEY: file.txt
      # Other function properties...
```

------
#### [ AWS SDKs ]

AWS SDK를 사용하여 환경 변수를 관리하려면 다음 API 작업을 사용합니다.
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

자세한 내용은 선호하는 프로그래밍 언어에 대한 [AWS SDK 설명서](https://aws.amazon.com/developer/tools/)를 참조하세요.

------

## 환경 변수에 대한 예제 시나리오
<a name="configuration-envvars-example"></a>

환경 변수를 사용하여 테스트 환경 및 프로덕션 환경에서 함수 동작을 사용자 지정할 수 있습니다. 예를 들어, 코드는 같지만 구성이 다른 두 개의 함수를 생성할 수 있습니다. 한 함수는 테스트 데이터베이스에 연결되고, 다른 함수는 프로덕션 데이터베이스에 연결됩니다. 이 경우 환경 변수를 사용하여 데이터베이스의 호스트 이름 및 기타 연결 세부 정보를 함수에 전달합니다.

다음 예는 환경 변수로 데이터베이스 호스트 및 데이터베이스 이름을 정의하는 방법을 보여줍니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/console-env.png)


테스트 환경에서 프로덕션 환경보다 더 많은 디버그 정보를 생성하도록 하려면 환경 변수를 설정하여 더 많은 상세 표시 로깅 또는 더 자세한 추적을 사용하도록 테스트 환경을 구성하면 됩니다.

예를 들어 테스트 환경에서 키 `LOG_LEVEL` 및 디버그 또는 트레이스의 로그 수준을 나타내는 값을 사용하여 환경 변수를 설정할 수 있습니다. Lambda 함수의 코드에서 이 환경 변수를 사용하여 로그 수준을 설정할 수 있습니다.

Python 및 Node.js의 다음 코드 예제에서는 이를 달성하는 방법을 보여줍니다. 이 예제에서는 환경 변수의 값이 Python에서는 `DEBUG` 또는 Node.js에서는 `debug`라고 가정합니다.

------
#### [ Python ]

**Example 로그 수준을 설정하는 Python 코드**  

```
import os
import logging

# Initialize the logger
logger = logging.getLogger()

# Get the log level from the environment variable and default to INFO if not set
log_level = os.environ.get('LOG_LEVEL', 'INFO')

# Set the log level
logger.setLevel(log_level)

def lambda_handler(event, context):
    # Produce some example log outputs
    logger.debug('This is a log with detailed debug information - shown only in test environment')
    logger.info('This is a log with standard information - shown in production and test environments')
```

------
#### [ Node.js (ES module format) ]

**Example 로그 수준을 설정하는 Node.js 코드**  
이 예제에서는 `winston` 로깅 라이브러리를 사용합니다. npm을 사용하여 함수의 배포 패키지에 이 라이브러리를 추가합니다. 자세한 내용은 [종속 항목이 있는 .zip 배포 패키지 생성](nodejs-package.md#nodejs-package-create-dependencies) 섹션을 참조하세요.  

```
import winston from 'winston';

// Initialize the logger using the log level from environment variables, defaulting to INFO if not set
const logger = winston.createLogger({
   level: process.env.LOG_LEVEL || 'info',
   format: winston.format.json(),
   transports: [new winston.transports.Console()]
});

export const handler = async (event) => {
   // Produce some example log outputs
   logger.debug('This is a log with detailed debug information - shown only in test environment');
   logger.info('This is a log with standard information - shown in production and test environment');
   
};
```

------

## Lambda 환경 변수 검색
<a name="retrieve-environment-variables"></a>

함수 코드에서 환경 변수를 검색하려면 프로그래밍 언어에 대한 표준 메서드를 사용합니다.

------
#### [ Node.js ]

```
let region = process.env.AWS_REGION
```

------
#### [ Python ]

```
import os
  region = os.environ['AWS_REGION']
```

**참고**  
경우에 따라 다음 형식을 사용해야 할 수 있습니다.  

```
region = os.environ.get('AWS_REGION')
```

------
#### [ Ruby ]

```
region = ENV["AWS_REGION"]
```

------
#### [ Java ]

```
String region = System.getenv("AWS_REGION");
```

------
#### [ Go ]

```
var region = os.Getenv("AWS_REGION")
```

------
#### [ C\$1 ]

```
string region = Environment.GetEnvironmentVariable("AWS_REGION");
```

------
#### [ PowerShell ]

```
$region = $env:AWS_REGION
```

------

Lambda는 저장 시 환경 변수를 암호화하여 안전하게 저장합니다. [다른 암호화 키를 사용하도록 Lambda를 구성](configuration-envvars-encryption.md)하거나, 클라이언트 측의 환경 변수 값을 암호화하거나, AWS Secrets Manager를 사용해 CloudFormation 템플릿에서 환경 변수를 설정할 수 있습니다.

## 정의된 런타임 환경 변수
<a name="configuration-envvars-runtime"></a>

Lambda [런타임](lambda-runtimes.md)은 초기화 중에 여러 환경 변수를 설정합니다. 대부분의 환경 변수는 함수 또는 런타임에 관한 정보를 제공합니다. 이러한 환경 변수의 키는 *예약*되어 있으며 함수 구성에서 설정할 수 없습니다.

**예약된 환경 변수**
+ `_HANDLER` – 함수에 대해 구성된 핸들러 위치입니다.
+ `_X_AMZN_TRACE_ID` – [X-Ray 추적 헤더](services-xray.md)입니다. 이 환경 변수는 간접 호출할 때마다 변경됩니다.
  + 이 환경 변수는 OS 전용 런타임(`provided` 런타임 제품군)에서 정의되지 않았습니다. [다음 호출](runtimes-api.md#runtimes-api-next)의 `Lambda-Runtime-Trace-Id` 응답 헤더를 사용하여 사용자 지정 런타임에 `_X_AMZN_TRACE_ID`을(를) 설정할 수 있습니다.
  + Java 런타임 버전 17 이상에서는 이 환경 변수가 사용되지 않습니다. 대신 Lambda는 `com.amazonaws.xray.traceHeader` 시스템 속성에 추적 정보를 저장합니다.
+ `AWS_DEFAULT_REGION` – Lambda 함수가 실행되는 기본 AWS 리전입니다.
+ `AWS_REGION` – Lambda 함수가 실행되는 AWS 리전입니다. 정의되면 이 값이 `AWS_DEFAULT_REGION`을 재정의합니다.
  + AWS SDK와 함께 AWS 리전 환경 변수를 사용하는 방법에 대한 자세한 내용은 **AWS SDK 및 도구 참조 안내서의 [AWS Region](https://docs.aws.amazon.com/sdkref/latest/guide/feature-region.html#feature-region-sdk-compat)을 참조하세요.
+ `AWS_EXECUTION_ENV` - [런타임 ID](lambda-runtimes.md)로서 앞에 `AWS_Lambda_`가 붙습니다(예: `AWS_Lambda_java8`). 이 환경 변수는 OS 전용 런타임(`provided` 런타임 제품군)에서 정의되지 않았습니다.
+ `AWS_LAMBDA_FUNCTION_NAME` – 함수의 이름입니다.
+ `AWS_LAMBDA_FUNCTION_MEMORY_SIZE` – 함수에 사용 가능한 총 메모리 양(MB)입니다.
+ `AWS_LAMBDA_FUNCTION_VERSION` – 실행할 함수의 버전입니다.
+ `AWS_LAMBDA_INITIALIZATION_TYPE` – 함수의 초기화 유형으로, `on-demand`, `provisioned-concurrency`, `snap-start` 또는 `lambda-managed-instances`입니다. 자세한 내용은 [프로비저닝된 동시성 구성](provisioned-concurrency.md), [Lambda SnapStart를 사용하여 시작 성능 개선](snapstart.md) 또는 [Lambda 관리형 인스턴스](lambda-managed-instances.md) 항목을 참조하세요.
+ `AWS_LAMBDA_LOG_GROUP_NAME`, `AWS_LAMBDA_LOG_STREAM_NAME` – 함수에 대한 Amazon CloudWatch Logs 그룹 및 스트림의 이름입니다. `AWS_LAMBDA_LOG_GROUP_NAME` 및 `AWS_LAMBDA_LOG_STREAM_NAME` [환경 변수](#configuration-envvars-runtime)는 Lambda SnapStart 함수에서 사용할 수 없습니다.
+ `AWS_ACCESS_KEY`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN` - 함수의 [실행 역할](lambda-intro-execution-role.md)에서 가져온 액세스 키입니다.
+ `AWS_LAMBDA_RUNTIME_API` – ([사용자 지정 런타임](runtimes-custom.md)) [런타임 API](runtimes-api.md)의 호스트 및 포트입니다.
+ `LAMBDA_TASK_ROOT` – Lambda 함수 코드의 경로입니다.
+ `LAMBDA_RUNTIME_DIR` – 런타임 라이브러리의 경로입니다.
+ `AWS_LAMBDA_MAX_CONCURRENCY` – (Lambda 관리형 인스턴스만 해당) Lambda가 하나의 실행 환경으로 전송할 최대 동시 간접 호출 수입니다.
+ `AWS_LAMBDA_METADATA_API` - `{ipv4_address}:{port}` 형식의 [메타데이터 엔드포인트](configuration-metadata-endpoint.md) 서버 주소입니다(예: `169.254.100.1:9001`).
+ `AWS_LAMBDA_METADATA_TOKEN` - [메타데이터 엔드포인트](configuration-metadata-endpoint.md)에 대한 요청을 인증하는 데 사용되는 현재 실행 환경의 고유 인증 토큰입니다. Lambda에서는 초기화 시 이 토큰을 자동으로 생성합니다.

다음 추가 환경 변수는 예약되어 있지 않으며 함수 구성에서 확장할 수 있습니다.

**예약되지 않은 환경 변수**
+ `LANG` - 이것은 런타임의 로캘입니다(`en_US.UTF-8`).
+ `PATH` - 실행 경로(`/usr/local/bin:/usr/bin/:/bin:/opt/bin`)입니다.
+ `LD_LIBRARY_PATH` 시스템 라이브러리 경로(`/var/lang/lib:/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib`)입니다.
+ `NODE_PATH` – ([Node.js](lambda-nodejs.md)) Node.js 라이브러리 경로(`/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules`)입니다.
+ `NODE_OPTIONS` – ([Node.js](lambda-nodejs.md)) Node.js 런타임의 경우 `NODE_OPTIONS`를 사용하여 Lambda가 기본적으로 비활성화하는 실험 기능을 재활성화할 수 있습니다.
+ `PYTHONPATH` - ([Python](lambda-python.md)) Python 라이브러리 경로(`$LAMBDA_RUNTIME_DIR`).
+ `GEM_PATH` – ([Ruby](lambda-ruby.md)) Ruby 라이브러리 경로(`$LAMBDA_TASK_ROOT/vendor/bundle/ruby/3.3.0:/opt/ruby/gems/3.3.0`)입니다.
+ `AWS_XRAY_CONTEXT_MISSING` – X-Ray 추적의 경우 Lambda는 X-Ray SDK에서 런타임 오류가 발생하지 않도록 `LOG_ERROR`로 설정합니다.
+ `AWS_XRAY_DAEMON_ADDRESS` – X-Ray 추적의 경우 X-Ray 데몬의 포트 및 IP 주소입니다.
+ `AWS_LAMBDA_DOTNET_PREJIT` - ([.NET](lambda-csharp.md)) 이 변수를 설정하여 .NET 특정 런타임 최적화를 활성화하거나 비활성화합니다. 값에는 `always`, `never` 및 `provisioned-concurrency`가 포함됩니다. 자세한 내용은 [함수에 대해 프로비저닝된 동시성 구성](provisioned-concurrency.md) 섹션을 참조하세요.
+ `TZ` - 환경의 표준 시간대(`:UTC`)입니다. 실행 환경에서는 NTP를 사용하여 시스템 클록을 동기화합니다.

표시된 샘플 값은 최신 런타임을 반영합니다. 특정 변수 또는 해당 값의 존재는 이전 런타임에 따라 다를 수 있습니다.

# Lambda 환경 변수 보안
<a name="configuration-envvars-encryption"></a>

환경 변수 보안을 위해 서버측 암호화를 이용해 저장 데이터를 보호하고 클라이언트측 암호화를 이용해 전송 중 데이터를 보호할 수 있습니다.

**참고**  
데이터베이스 보안을 강화하려면 환경 변수 대신 AWS Secrets Manager를 사용하여 데이터베이스 보안 인증 정보를 저장하는 것이 좋습니다. 자세한 내용은 [Lambda 함수에서 Secrets Manager 보안 암호 사용](with-secrets-manager.md) 섹션을 참조하세요.

**저장 중 보안**  
Lambda는 AWS KMS key를 이용해 항상 저장 중 서버 측 암호화를 제공합니다. 기본적으로 Lambda는 AWS 관리형 키를 사용합니다. 이 기본 동작이 워크플로에 적합한 경우 다른 작업을 설정할 필요가 없습니다. Lambda가 계정에 AWS 관리형 키를 생성하고 사용자에 대한 권한을 관리합니다. AWS에서는 이 키의 사용에 대한 요금을 청구하지 않습니다.

원한다면 AWS KMS 고객 관리형 키를 대신 제공할 수 있습니다. KMS 키의 교체를 제어하거나 KMS 키를 관리하기 위한 조직의 요구 사항을 충족하기 위해 이 작업을 수행할 수 있습니다. 고객 관리형 키를 사용하면 KMS 키에 대한 액세스 권한이 있는 계정의 사용자만 함수에서 환경 변수를 보거나 관리할 수 있습니다.

고객 관리형 키에는 표준 AWS KMS 요금이 발생합니다. 자세한 내용은 [AWS Key Management Service 요금](https://aws.amazon.com/kms/pricing/)을 참조하십시오.

**전송 중 보안**  
보안을 강화하기 위해 전송 중 암호화를 위한 도우미를 사용하도록 설정하면 전송 중 보호를 위해 환경 변수가 클라이언트 측으로 암호화됩니다.

**환경 변수 암호화를 구성하려면**

1. AWS Key Management Service(AWS KMS)를 사용하여 서버 측 및 클라이언트 측 암호화에 사용할 Lambda에 대한 고객 관리형 키를 생성할 수 있습니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*에서 [키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)을 참조하세요.

1. Lambda 콘솔을 사용하여 **환경 변수 편집** 페이지로 이동합니다.

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

   1. 함수를 선택합니다.

   1. **구성**을 선택한 다음 왼쪽 탐색 모음에서 **환경 변수**를 선택합니다.

   1. **환경 변수** 섹션에서 **편집**을 선택합니다.

   1. **Encryption configuration(암호화 구성)**을 확장합니다.

1. (선택 사항) 클라이언트측 암호화를 사용하여 전송 중 데이터를 보호하도록 콘솔 암호화 도우미를 활성화합니다.

   1. **전송 중 암호화**에서 **전송 중 암호화에 대해 도우미 사용**을 선택합니다.

   1. 콘솔 암호화 도우미를 사용 설정하려는 각 환경 변수에 대해 환경 변수 옆에 있는 **암호화**를 선택합니다.

   1.  전송 중 암호화할 AWS KMS key에서, 이 절차를 시작할 때 생성한 고객 관리형 키를 선택합니다.

   1. **실행 역할 정책**을 선택하고 정책을 복사합니다. 이 정책은 환경 변수를 복호화할 수 있는 권한을 함수의 실행 역할에 부여합니다.

      이 정책을 저장하여 절차의 마지막 단계에서 사용합니다.

   1. 환경 변수를 복호화하는 함수에 코드를 추가합니다. 예제를 보려면 **암호 코드 조각 해독**을 선택합니다.

1. (선택 사항) 유휴 시 암호화를 위해 고객 관리형 키를 지정합니다.

   1. **고객 마스터 키 사용**을 선택합니다.

   1. 이 절차를 시작할 때 생성한 고객 관리형 키를 선택합니다.

1. **저장**을 선택합니다.

1. 권한을 설정합니다.

   서버 측 암호화와 함께 고객 관리형 키를 사용하는 경우, 함수에서 환경 변수를 보거나 관리할 수 있는 사용자 또는 역할에 권한을 부여하세요. 자세한 내용은 [서버 측 암호화 KMS 키에 대한 권한 관리](#managing-permissions-to-your-server-side-encryption-key) 섹션을 참조하세요.

   전송 중 보안을 위해 클라이언트 측 암호화를 사용하도록 설정하는 경우, 함수가 `kms:Decrypt` API 작업을 호출하려면 권한이 필요합니다. 이전에 이 절차에서 저장한 정책을 함수의 [실행 역할](lambda-intro-execution-role.md)에 추가합니다.

## 서버 측 암호화 KMS 키에 대한 권한 관리
<a name="managing-permissions-to-your-server-side-encryption-key"></a>

사용자 또는 함수의 실행 역할에 대한 AWS KMS 권한 없이도 기본 암호화 키를 사용할 수 있습니다. 고객 관리형 CMK를 사용하려면 키 사용 권한이 필요합니다. Lambda는 사용자의 권한을 사용하여 키에 대한 권한 부여를 생성합니다. 이를 통해 Lambda가 암호화에 해당 키를 사용할 수 있습니다.
+ `kms:ListAliases` – Lambda 콘솔에서 키 보기.
+ `kms:CreateGrant`, `kms:Encrypt` – 함수에 대한 고객 관리형 키 구성하기
+ `kms:Decrypt` – 고객 관리형 키로 암호화된 환경 변수를 보고 관리하기

AWS 계정 또는 키의 리소스 기반 권한 정책에서 이러한 권한을 얻을 수 있습니다. `ListAliases`는 [Lambda의 관리형 정책](access-control-identity-based.md)에서 제공합니다. 키 정책에 따라 **키 사용자** 그룹의 사용자는 나머지 권한을 받습니다.

`Decrypt` 권한이 없는 사용자도 기능을 관리할 수 있지만 Lambda 콘솔에서 환경 변수를 보거나 관리할 수는 없습니다. 사용자가 환경 변수를 볼 수 없도록 하려면 기본 키, 고객 관리형 키 또는 모든 키에 대한 액세스를 거부하는 사용자 권한에 문을 추가합니다.

**Example IAM 정책 - 키 ARN별 액세스 거부**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-2:111122223333:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc"
        }
    ]
}
```

키 권한 관리에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [Key policies in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)를 참조하세요.

# Lambda 함수에 Amazon VPC의 리소스에 대한 액세스 권한 부여
<a name="configuration-vpc"></a>

Amazon Virtual Private Cloud(Amazon VPC)를 사용하면 AWS 계정에 프라이빗 네트워크를 생성하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, Amazon Relational Database Service(Amazon RDS) 인스턴스 및 Amazon ElastiCache 인스턴스 같은 리소스를 호스팅할 수 있습니다. 리소스가 포함된 프라이빗 서브넷을 통해 함수를 VPC에 연결하여 Lambda 함수에 Amazon VPC에서 호스팅된 리소스에 대한 액세스 권한을 부여할 수 있습니다. Lambda 콘솔 AWS Command Line Interface(AWS CLI) 또는 AWS SAM을 사용하여 Amazon VPC에 Lambda 함수를 연결하려면 다음 섹션의 지침을 따릅니다.

**참고**  
모든 Lambda 함수는 Lambda 서비스가 소유하고 관리하는 VPC 내에서 실행됩니다. 이러한 VPC는 Lambda에 의해 자동으로 유지 관리되며 고객에게는 표시되지 않습니다. Amazon VPC의 다른 AWS 리소스에 액세스하도록 함수를 구성해도 함수가 내부에서 실행하는 Lambda 관리형 VPC에는 영향을 미치지 않습니다.

**Topics**
+ [필수 IAM 권한](#configuration-vpc-permissions)
+ [Lambda 함수를 AWS 계정의 Amazon VPC에 연결하기](#configuration-vpc-attaching)
+ [VPC에 연결 시 인터넷 액세스](#configuration-vpc-internet-access)
+ [IPv6 지원](#configuration-vpc-ipv6)
+ [Amazon VPC로 Lambda를 사용하는 모범 사례](#configuration-vpc-best-practice)
+ [Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기](#configuration-vpc-enis)
+ [VPC 설정에 IAM 조건 키 사용](#vpc-conditions)
+ [VPC 자습서](#vpc-tutorials)

## 필수 IAM 권한
<a name="configuration-vpc-permissions"></a>

Lambda 함수를 AWS 계정의 Amazon VPC에 연결하려면 Lambda가 사용하는 네트워크 인터페이스를 생성하고 관리할 권한이 있어야 함수에 VPC의 리소스에 대한 액세스 권한을 부여할 수 있습니다.

Lambda가 생성하는 네트워크 인터페이스는 Hyperplane 탄력적 네트워크 인터페이스 또는 Hyperplane ENI라고 알려져 있습니다. 이러한 네트워크 인터페이스에 대한 자세한 내용은 [Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기](#configuration-vpc-enis) 섹션을 참조하세요.

함수의 실행 역할에 AWS 관리형 정책 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html)을 연결하여 함수에 필요한 권한을 부여할 수 있습니다. Lambda 콘솔에서 새 함수를 생성하여 VPC에 연결하면 Lambda는 자동으로 이 권한 정책을 추가합니다.

자체 IAM 권한 정책을 생성하고 싶다면 다음 권한을 모두 추가하고 모든 리소스에 대한 권한을 허용해야 합니다(`"Resource": "*"`).
+ ec2:CreateNetworkInterface
+ ec2:DescribeNetworkInterfaces
+ ec2:DescribeSubnets
+ ec2:DeleteNetworkInterface
+ ec2:AssignPrivateIpAddresses
+ ec2:UnassignPrivateIpAddresses

참고로 함수 역할에는 네트워크 인터페이스를 생성할 때만 이러한 권한이 필요하며 함수를 간접 호출할 때는 필요하지 않습니다. 함수의 실행 역할에서 이러한 권한을 제거하더라도 함수가 Amazon VPC에 연결된 경우 여전히 성공적으로 함수를 간접 호출할 수 있습니다.

함수를 VPC에 연결하려면 Lambda는 또한 IAM 사용자 역할을 사용하여 네트워크 리소스를 확인해야 합니다. 사용자 역할에 IAM 권한이 있는지 확인해야 합니다.
+ **ec2:DescribeSecurityGroups**
+ **ec2:DescribeSubnets**
+ **ec2:DescribeVpcs**
+ **ec2:GetSecurityGroupsForVpc**

**참고**  
함수의 실행 역할에 부여한 Amazon EC2 권한은 Lambda 서비스에서 함수를 VPC에 연결하는 데 사용됩니다. 그러나 이러한 권한을 함수 코드에도 암시적으로 부여하고 있습니다. 이는 함수 코드가 이러한 Amazon EC2 API 호출을 수행할 수 있다는 의미입니다. 보안 모범 사례 준수에 대한 자세한 내용은 [보안 모범 사례](#configuration-vpc-best-practice-security) 섹션을 참조하세요.

## Lambda 함수를 AWS 계정의 Amazon VPC에 연결하기
<a name="configuration-vpc-attaching"></a>

Lambda 콘솔인 AWS CLI 또는 AWS SAM을 사용하여 함수를 AWS 계정의 Amazon VPC에 연결합니다. AWS CLI 또는 AWS SAM을 사용하는 경우나 Lambda 콘솔을 사용하여 VPC에 기존 함수를 연결하는 경우에는 함수의 실행 역할에 이전 섹션에서 나열된 필수 권한이 있는지 확인합니다.

Lambda 함수는 [전용 인스턴스 테넌시](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html)를 사용하여 VPC에 직접 연결할 수 없습니다. 전용 VPC의 리소스에 연결하려면, [기본 테넌시를 사용하여 두 번째 VPC에 피어로 연결](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-dedicated-vpc/)합니다.

------
#### [ Lambda console ]

**Amazon VPC를 생성할 때 APC Amazon에 함수를 연결하려면**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 열고 **함수 생성**을 선택합니다.

1. **기본 정보(Basic information)**에서 **함수 이름(Function name)**에 함수 이름을 입력합니다.

1. 다음을 수행하여 함수에 대한 VPC 설정을 구성합니다.

   1. **Advanced settings(고급 설정)**를 확장합니다.

   1. **VPC 활성화**를 선택한 다음 함수를 연결할 VPC를 선택합니다.

   1. (선택 사항) [아웃바운드 IPv6 트래픽](#configuration-vpc-ipv6)을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택합니다.

   1. 네트워크 인터페이스를 생성할 서브넷 및 보안 그룹을 선택합니다. **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.
**참고**  
프라이빗 리소스에 연결하려면 함수를 프라이빗 서브넷에 액세스합니다. 함수에 인터넷 액세스가 필요한 경우 [VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화](configuration-vpc-internet.md) 섹션을 참조하세요. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스 권한 또는 퍼블릭 IP 주소는 제공되지 않습니다.

1. **함수 생성**을 선택합니다.

**Amazon VPC에 기존 함수를 연결하려면**

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

1. **구성** 탭을 선택한 다음 **VPC**를 선택합니다.

1. **편집**을 선택합니다.

1. **VPC**에서 함수를 연결할 Amazon VPC를 선택합니다.

1. (선택 사항) [아웃바운드 IPv6 트래픽](#configuration-vpc-ipv6)을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택합니다.

1. 네트워크 인터페이스를 생성할 서브넷 및 보안 그룹을 선택합니다. **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.
**참고**  
프라이빗 리소스에 연결하려면 함수를 프라이빗 서브넷에 액세스합니다. 함수에 인터넷 액세스가 필요한 경우 [VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화](configuration-vpc-internet.md) 섹션을 참조하세요. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스 권한 또는 퍼블릭 IP 주소는 제공되지 않습니다.

1. **저장**을 선택합니다.

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

**Amazon VPC를 생성할 때 APC Amazon에 함수를 연결하려면**
+ Lambda 함수를 생성하고 VPC에 연결하려면 다음 CLI `create-function` 명령을 실행합니다.

  ```
  aws lambda create-function --function-name my-function \
  --runtime nodejs24.x --handler index.js --zip-file fileb://function.zip \
  --role arn:aws:iam::123456789012:role/lambda-role \
  --vpc-config Ipv6AllowedForDualStack=true,SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb
  ```

  자체 서브넷과 보안 그룹을 지정하고 사용 사례에 따라 `Ipv6AllowedForDualStack`을 `true` 또는 `false`에 설정합니다.

**Amazon VPC에 기존 함수를 연결하려면**
+ VPC에 기존 함수를 연결하려면 다음 CLI `update-function-configuration` 명령을 실행합니다.

  ```
  aws lambda update-function-configuration --function-name my-function \
  --vpc-config Ipv6AllowedForDualStack=true, SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb
  ```

**VPC에서 함수를 연결 해제하려면**
+ VPC에서 함수를 연결 해제하려면 VPC 서브넷 및 보안 그룹의 빈 목록을 사용하여 다음 `update-function-configuration`CLI 명령을 실행합니다.

  ```
  aws lambda update-function-configuration --function-name my-function \
  --vpc-config SubnetIds=[],SecurityGroupIds=[]
  ```

------
#### [ AWS SAM ]

**함수를 VPC에 연결하려면**
+ Amazon VPC에 Lambda 함수를 연결하려면 다음 예제 템플릿과 같이 함수 정의에 `VpcConfig` 속성을 추가합니다. 이 속성에 대한 자세한 내용은 *CloudFormation 사용 설명서*의 [AWS::Lambda::Function VpcConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-vpcconfig.html)를 참조하세요(AWS SAM `VpcConfig` 속성은 CloudFormation `AWS::Lambda::Function` 리소스의 `VpcConfig` 속성으로 직접 전달됨).

  ```
  AWSTemplateFormatVersion: '2010-09-09'
  Transform: AWS::Serverless-2016-10-31
  
  Resources:
    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        CodeUri: ./lambda_function/
        Handler: lambda_function.handler
        Runtime: python3.12
        VpcConfig:
          SecurityGroupIds:
            - !Ref MySecurityGroup
          SubnetIds:
            - !Ref MySubnet1
            - !Ref MySubnet2
        Policies:
          - AWSLambdaVPCAccessExecutionRole
  
    MySecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: Security group for Lambda function
        VpcId: !Ref MyVPC
  
    MySubnet1:
      Type: AWS::EC2::Subnet
      Properties:
        VpcId: !Ref MyVPC
        CidrBlock: 10.0.1.0/24
  
    MySubnet2:
      Type: AWS::EC2::Subnet
      Properties:
        VpcId: !Ref MyVPC
        CidrBlock: 10.0.2.0/24
  
    MyVPC:
      Type: AWS::EC2::VPC
      Properties:
        CidrBlock: 10.0.0.0/16
  ```

  AWS SAM에서 VPC 구성에 대한 자세한 내용은 *CloudFormation 사용 설명서의* [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpc.html)를 참조하세요.

------

## VPC에 연결 시 인터넷 액세스
<a name="configuration-vpc-internet-access"></a>

기본적으로 Lambda 함수는 퍼블릭 인터넷에 액세스할 수 있습니다. 함수를 VPC에 연결하는 경우 해당 VPC 내에서 사용 가능한 리소스에만 액세스할 수 있습니다. 함수에 인터넷 액세스 권한을 부여하려면 인터넷에 액세스 할 수 있도록 VPC도 구성해야 합니다. 자세한 내용은 [VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화](configuration-vpc-internet.md)를 참조하세요.

## IPv6 지원
<a name="configuration-vpc-ipv6"></a>

함수는 IPv6를 통해 듀얼 스택 VPC 서브넷의 리소스에 연결할 수 있습니다. 이 옵션은 기본적으로 꺼져 있습니다. 아웃바운드 IPv6 트래픽을 허용하려면, 콘솔을 사용하거나 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 또는 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령과 함께 `--vpc-config Ipv6AllowedForDualStack=true` 옵션을 사용하세요.

**참고**  
VPC에서 아웃바운드 IPv6 트래픽을 허용하려면 함수에 연결된 모든 서브넷이 듀얼 스택 서브넷이어야 합니다. Lambda는 VPC의 IPv6 전용 서브넷을 위한 아웃바운드 IPv6 연결 또는 VPC에 연결되지 않은 함수를 위한 아웃바운드 IPv6 연결을 지원하지 않습니다.

IPv6를 통해 서브넷 리소스에 명시적으로 연결하도록 함수 코드를 업데이트할 수 있습니다. 다음 Python 예제는 소켓을 열고 IPv6 서버에 연결합니다.

**Example - IPv6 서버에 연결**  

```
def connect_to_server(event, context):
    server_address = event['host']
    server_port = event['port']
    message = event['message']
    run_connect_to_server(server_address, server_port, message)

def run_connect_to_server(server_address, server_port, message):
    sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
    try:
        # Send data
        sock.connect((server_address, int(server_port), 0, 0))
        sock.sendall(message.encode())
        BUFF_SIZE = 4096
        data = b''
        while True:
            segment = sock.recv(BUFF_SIZE)
            data += segment
            # Either 0 or end of data
            if len(segment) < BUFF_SIZE:
                break
        return data
    finally:
        sock.close()
```

## Amazon VPC로 Lambda를 사용하는 모범 사례
<a name="configuration-vpc-best-practice"></a>

Lambda VPC 구성이 모범 사례 지침을 준수하려면 다음 섹션의 조언을 따릅니다.

### 보안 모범 사례
<a name="configuration-vpc-best-practice-security"></a>

Lambda 함수를 VPC에 연결하려면 함수의 실행 역할에 여러 Amazon EC2 권한을 부여해야 합니다. 함수가 VPC의 리소스에 액세스하는 데 사용하는 네트워크 인터페이스를 생성하려면 이러한 권한이 필요합니다. 그러나 이러한 권한은 함수 코드에도 암시적으로 부여됩니다. 이는 함수 코드에 이러한 Amazon EC2 API 호출을 수행할 수 있는 권한이 있다는 의미입니다.

최소 권한 액세스 원칙을 따르려면 함수의 실행 역할에 다음 예시와 같은 거부 정책을 추가합니다. 이 정책은 함수 코드가 Amazon EC2 API를 직접 호출하는 것을 방지하면서 Lambda 서비스가 사용자를 대신하여 VPC 리소스를 관리하도록 허용합니다. 이 정책은 실행 중에 함수 코드에 의한 API 직접 호출에만 적용되는 `lambda:SourceFunctionArn` 조건 키를 사용합니다. 자세한 내용은 [소스 함수 ARN을 사용하여 함수 액세스 동작 제어](permissions-source-function-arn.md) 섹션을 참조하세요.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [ 
                 "ec2:CreateNetworkInterface",
                 "ec2:DeleteNetworkInterface",
                 "ec2:DescribeNetworkInterfaces",
                 "ec2:DescribeSubnets",
                 "ec2:DetachNetworkInterface",
                 "ec2:AssignPrivateIpAddresses",
                 "ec2:UnassignPrivateIpAddresses"
            ],
            "Resource": [ "*" ],
            "Condition": {
                "ArnEquals": {
                    "lambda:SourceFunctionArn": [
                        "arn:aws:lambda:us-west-2:123456789012:function:my_function"
                    ]
                }
            }
        }
    ]
}
```

------

AWS는 VPC의 보안을 강화하기 위해 *[보안 그룹](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)*과 *[네트워크 액세스 제어 목록(ACL)](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)*을 제공합니다. 보안 그룹은 리소스용 인바운드 및 아웃바운드 트래픽을 제어하고, 네트워크 ACL은 서브넷용 인바운드 및 아웃바운드 트래픽을 제어합니다. 보안 그룹은 대부분의 서브넷에 대해 충분한 액세스 제어를 제공합니다. VPC에 대한 추가 보안 계층을 원하는 경우 네트워크 ACL을 사용할 수 있습니다. Amazon VPC를 사용할 때의 보안 모범 사례에 대한 일반 지침은 *Amazon Virtual Private Cloud 사용 설명서*에서 [VPC의 보안 모범 사례](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-best-practices.html)를 참조하세요.

### 성능 모범 사례
<a name="configuration-vpc-best-practice-performance"></a>

함수를 VPC에 연결하면 Lambda는 연결에 사용할 수 있는 이용 가능한 네트워크 리소스(Hyperplane ENI)가 있는지 확인합니다. Hyperplane ENI는 보안 그룹 및 VPC 서브넷의 특정 조합과 연결됩니다. 한 함수를 VPC에 이미 연결한 경우 다른 함수를 연결할 때 동일한 서브넷과 보안 그룹을 지정하면 Lambda가 네트워크 리소스를 공유할 수 있으므로 Hyperplane ENI를 새로 생성할 필요가 없어집니다. Hyperplane ENI와 수명 주기에 대한 자세한 내용은 [Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기](#configuration-vpc-enis) 섹션을 참조하세요.

## Hyperplane 탄력적 네트워크 인터페이스(ENIs) 이해하기
<a name="configuration-vpc-enis"></a>

Hyperplane ENI는 Lambda 함수와 함수를 연결하려는 리소스 간의 네트워크 인터페이스 역할을 하는 관리형 리소스입니다. Lambda 서비스는 함수를 VPC에 연결할 때 이러한 ENI를 자동으로 생성하고 관리합니다.

Hyperplane ENI는 직접 볼 수 없으므로 구성하거나 관리할 필요가 없습니다. 하지만 작동 방식을 알면 함수를 VPC에 연결할 때의 함수 동작을 이해하는 데 도움이 될 수 있습니다.

특정 서브넷과 보안 그룹 조합을 사용하여 함수를 VPC에 처음 연결하는 경우 Lambda가 Hyperplane ENI를 생성합니다. 동일한 서브넷과 보안 그룹 조합을 사용하는 계정의 다른 함수도 이 ENI를 사용할 수 있습니다. Lambda는 가능한 곳에서 기존 ENI를 재사용하여 리소스 활용을 최적화하고 새 ENI 생성을 최소화합니다. 각 Hyperplane ENI는 최대 65,000개의 연결/포트를 지원합니다. 연결 수가 이 한도를 초과하는 경우 Lambda는 네트워크 트래픽 및 동시성 요구 사항에 따라 ENI 수를 자동으로 조정합니다.

새 함수의 경우, Lambda가 Hyperplane ENI를 생성하는 동안에는 함수가 보류 중 상태로 유지되므로 함수를 간접 호출할 수 없습니다. 함수는 Hyperplane ENI가 준비된 경우에만 활성 상태로 전환되며 몇 분 정도 소요될 수 있습니다. 기존 함수의 경우 버전 생성 또는 함수의 코드 업데이트 같이 함수를 대상으로 하는 추가 작업을 수행할 수는 없지만 이전 버전의 함수를 계속 간접 호출할 수는 있습니다.

ENI 수명 주기 관리의 일환으로 Lambda는 ENI를 삭제하고 다시 생성하여 ENI 전반의 네트워크 트래픽을 로드 밸런싱하거나 ENI 상태 확인에서 발견된 문제를 해결할 수 있습니다. 또한, Lambda 함수가 연속으로 14일 동안 유휴 상태로 유지되면 Lambda는 사용되지 않는 모든 Hyperplane ENI를 회수하고 함수 상태를 `Inactive` 상태로 설정합니다. 다음 호출은 실패하며 Lambda가 Hyperplane ENI의 생성 또는 할당을 완료할 때까지 함수는 보류 중 상태로 다시 전환됩니다. ENI의 지속성에 의존하지 않는 것을 권장드립니다.

VPC 구성을 제거하기 위해 함수를 업데이트하는 경우 Lambda에서 연결된 Hyperplane ENI를 삭제하는 데 최대 20분이 소요됩니다. Lambda는 다른 함수(또는 게시된 함수 버전)가 해당 Hyperplane ENI를 사용하고 있지 않은 경우에만 ENI를 삭제합니다.

Lambda는 함수 [실행 역할](lambda-intro-execution-role.md)의 권한에 따라 Hyperplane ENI를 삭제합니다. Lambda가 Hyperplane ENI를 삭제하기 전에 실행 역할을 삭제하면 Lambda가 Hyperplane ENI를 삭제할 수 없습니다. 수동으로 삭제를 수행할 수 있습니다.

## VPC 설정에 IAM 조건 키 사용
<a name="vpc-conditions"></a>

VPC 설정에 Lambda 특정 조건 키를 사용하여 Lambda 함수에 대한 추가 권한 제어를 제공할 수 있습니다. 예를 들어 조직의 모든 함수가 VPC에 연결되도록 요구할 수 있습니다. 또한 함수의 사용자가 사용할 수 있고 사용할 수 없는 서브넷 및 보안 그룹을 지정할 수도 있습니다.

Lambda는 IAM 정책에서 다음 조건 키를 지원합니다.
+ **lambda:VpcIds** – 하나 이상의 VPC를 허용하거나 거부합니다.
+ **lambda:SubnetIds** – 하나 이상의 서브넷을 허용하거나 거부합니다.
+ **lambda:SecurityGroupIds** – 하나 이상의 보안 그룹을 허용하거나 거부합니다.

Lambda API 작업 [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html) 및 [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)은 이러한 조건 키를 지원합니다. IAM 정책의 조건 키 사용 방법에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.

**작은 정보**  
함수에 이전 API 요청의 VPC 구성이 이미 포함되어 있는 경우 VPC 구성 없이 `UpdateFunctionConfiguration` 요청을 보낼 수 있습니다.

### VPC 설정에 대한 조건 키가 있는 정책의 예제
<a name="vpc-condition-examples"></a>

다음 예제에서는 VPC 설정에 조건 키를 사용하는 방법을 보여줍니다. 원하는 제한 사항이 있는 정책 구문을 생성한 후 대상 사용자 또는 역할에 대한 정책 구문을 추가합니다.

#### 사용자가 VPC 연결 함수만 배포하도록 보장
<a name="vpc-condition-example-1"></a>

모든 사용자가 VPC 연결 함수만 배포하도록 보장하려면 유효한 VPC ID가 포함되지 않은 함수 생성 및 업데이트 작업을 거부할 수 있습니다.

VPC ID는 `CreateFunction` 또는 `UpdateFunctionConfiguration` 요청에 대한 입력 파라미터가 아닙니다. Lambda는 서브넷 및 보안 그룹 파라미터를 기반으로 VPC ID 값을 검색합니다.

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "EnforceVPCFunction",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "Null": {
           "lambda:VpcIds": "true"
        }
      }
    }
  ]
}
```

------

#### 특정 VPC, 서브넷 또는 보안 그룹에 대한 사용자 액세스 거부
<a name="vpc-condition-example-2"></a>

특정 VPC에 대한 사용자의 액세스를 거부하려면 `StringEquals`를 사용하여 `lambda:VpcIds` 조건 값을 확인합니다. 다음 예제에서는 `vpc-1` 및 `vpc-2`에 대한 사용자 액세스를 거부합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnforceOutOfVPC",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Effect": "Deny",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "lambda:VpcIds": [
                        "vpc-1",
                        "vpc-2"
                    ]
                }
            }
        }
    ]
}
```

------

특정 서브넷에 대한 사용자의 액세스를 거부하려면 `StringEquals`를 사용하여 `lambda:SubnetIds` 조건 값을 확인합니다. 다음 예제에서는 `subnet-1` 및 `subnet-2`에 대한 사용자 액세스를 거부합니다.

```
{
      "Sid": "EnforceOutOfSubnet",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
            "lambda:SubnetIds": ["subnet-1", "subnet-2"]
        }
      }
    }
```

특정 보안 그룹에 대한 사용자의 액세스를 거부하려면 `StringEquals`를 사용하여 `lambda:SecurityGroupIds` 조건 값을 확인합니다. 다음 예제에서는 `sg-1` 및 `sg-2`에 대한 사용자 액세스를 거부합니다.

```
{
      "Sid": "EnforceOutOfSecurityGroups",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "ForAnyValue:StringEquals": {
            "lambda:SecurityGroupIds": ["sg-1", "sg-2"]
        }
      }
    }
  ]
}
```

#### 사용자가 특정 VPC 설정을 사용하여 함수를 생성 및 업데이트하도록 허용
<a name="vpc-condition-example-3"></a>

특정 VPC에 대한 사용자의 액세스를 허용하려면 `StringEquals`를 사용하여 `lambda:VpcIds` 조건 값을 확인합니다. 다음 예제에서는 사용자가 `vpc-1` 및 `vpc-2`에 액세스하도록 허용합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "EnforceStayInSpecificVpc",
            "Action": [
                "lambda:CreateFunction",
                "lambda:UpdateFunctionConfiguration"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "lambda:VpcIds": [
                        "vpc-1",
                        "vpc-2"
                    ]
                }
            }
        }
    ]
}
```

------

특정 서브넷에 대한 사용자의 액세스를 허용하려면 `StringEquals`를 사용하여 `lambda:SubnetIds` 조건 값을 확인합니다. 다음 예제에서는 사용자가 `subnet-1` 및 `subnet-2`에 액세스하도록 허용합니다.

```
{
      "Sid": "EnforceStayInSpecificSubnets",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
            "lambda:SubnetIds": ["subnet-1", "subnet-2"]
        }
      }
    }
```

특정 보안 그룹에 대한 사용자의 액세스를 허용하려면 `StringEquals`를 사용하여 `lambda:SecurityGroupIds` 조건 값을 확인합니다. 다음 예제에서는 사용자가 `sg-1` 및 `sg-2`에 액세스하도록 허용합니다.

```
{
      "Sid": "EnforceStayInSpecificSecurityGroup",
      "Action": [
          "lambda:CreateFunction",
          "lambda:UpdateFunctionConfiguration"
       ],
      "Effect": "Allow",
      "Resource": "*",
      "Condition": {
        "ForAllValues:StringEquals": {
            "lambda:SecurityGroupIds": ["sg-1", "sg-2"]
        }
      }
    }
  ]
}
```

## VPC 자습서
<a name="vpc-tutorials"></a>

다음 자습서에서는 Lambda 함수를 VPC의 리소스에 연결합니다.
+ [자습서: Amazon VPC에서 Amazon RDS에 액세스하도록 Lambda 함수 사용](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html)
+ [자습서: Amazon VPC에서 Amazon ElastiCache에 액세스하도록 Lambda 함수 구성](https://docs.aws.amazon.com/AmazonElastiCache/latest/dg/LambdaRedis.html)

# Lambda 함수에 다른 계정의 Amazon VPC에 있는 리소스에 대한 액세스 권한 부여
<a name="configuration-vpc-cross-account"></a>

다른 계정에서 관리하는 Amazon Virtual Private Cloud의 Amazon VPC에 있는 리소스에 대한 액세스 권한을 AWS Lambda 함수에 부여하면, 두 VPC 중 어느 쪽도 인터넷에 노출되지 않습니다. 이 액세스 패턴을 사용하면 AWS를 사용하는 다른 조직과 데이터를 공유할 수 있습니다. 이 액세스 패턴을 사용하면 인터넷보다 더 높은 수준의 보안과 성능으로 VPC 간에 데이터를 공유할 수 있습니다. 이러한 리소스에 액세스하기 위해 Amazon VPC 피어링 연결을 사용하도록 Lambda 함수를 구성하세요.

**주의**  
계정 또는 VPC 간 액세스를 허용할 때는 플랜이 해당 계정을 관리하는 각 조직의 보안 요구 사항을 충족하는지 확인하세요. 이 문서의 지침을 따르면 리소스의 보안 태세에 영향을 미칠 수 있습니다.

이 자습서에서는 IPv4를 사용하여 두 개의 계정을 피어링 연결로 연결합니다. Amazon VPC에 아직 연결되지 않은 Lambda 함수를 구성합니다. 고정 IP를 제공하지 않는 리소스에 함수를 연결하도록 DNS 확인을 구성합니다. 이 지침을 다른 피어링 시나리오에 적용하려면 [VPC 피어링 설명서](https://docs.aws.amazon.com//vpc/latest/peering/what-is-vpc-peering.html)를 참조하세요.

## 사전 조건
<a name="w2aac35c65b9"></a>

Lambda 함수에 다른 계정의 리소스에 대한 액세스 권한을 부여하려면 다음이 필요합니다.
+ 리소스로 인증한 다음 리소스에서 읽도록 구성된 Lambda 함수
+ Amazon VPC를 통해 사용할 수 있는 다른 계정의 리소스(예: Amazon RDS 클러스터)
+ Lambda 함수 계정 및 리소스 계정의 자격 증명. 리소스 계정을 사용할 권한이 없는 경우 승인된 사용자에게 문의하여 해당 계정을 준비하세요.
+ Lambda 함수와 연결할 VPC와 지원하는 Amazon VPC 리소스를 생성하고 업데이트할 수 있는 권한
+ Lambda 함수의 실행 역할과 VPC 구성을 업데이트할 수 있는 권한
+ Lambda 함수의 계정에서 VPC 피어링 연결을 생성할 수 있는 권한
+ 리소스 계정의 VPC 피어링 연결을 수락할 수 있는 권한
+ 리소스의 VPC와 지원하는 Amazon VPC 리소스의 구성을 업데이트할 수 있는 권한
+ Lambda 함수를 간접적으로 간접 호출할 수 있는 권한입니다.

## 함수의 계정에서 Amazon VPC 생성
<a name="w2aac35c65c11"></a>

Lambda 함수의 계정에서 Amazon VPC, 서브넷, 라우팅 테이블 및 보안 그룹을 생성합니다.

**콘솔을 사용하여 VPC, 서브넷 및 기타 VPC 리소스를 생성하려면**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. 대시보드에서 **VPC 생성**을 선택합니다.

1. **IPv4 CIDR 블록**에 프라이빗 CIDR 블록을 제공합니다. CIDR 블록은 리소스의 VPC에 사용되는 블록과 겹치지 않아야 합니다. 리소스의 VPC가 리소스에 IP를 할당하는 데 사용하는 블록이나 리소스 VPC의 라우팅 테이블에 이미 정의된 블록은 선택하지 마세요. 적절한 CIDR 블록을 정의하는 방법에 대한 자세한 내용은 [VPC CIDR 블록](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-cidr-blocks.html)을 참조하세요.

1. **AZ 사용자 지정**을 선택합니다.

1. 리소스와 동일한 AZ를 선택합니다.

1. **퍼블릭 서브넷 수**로 **0**을 선택합니다.

1. **VPC 엔드포인트**는 **없음**을 선택합니다.

1. **VPC 생성**을 선택합니다.

## 함수의 실행 역할에 VPC 권한 부여
<a name="w2aac35c65c13"></a>

함수의 실행 역할에 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html)을 연결하여 VPC에 연결할 수 있도록 허용합니다.

**함수의 실행 역할에 VPC 권한을 부여하려면 다음을 수행하세요.**

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

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

1. **구성**을 선택합니다.

1. **권한**을 선택합니다.

1. **역할 이름**에서 실행 역할을 선택합니다.

1. **권한 정책** 섹션에서 **권한 추가**를 선택합니다.

1. 드롭다운 목록에서 **정책 연결**을 선택합니다.

1. 검색 상자에 `AWSLambdaVPCAccessExecutionRole`을(를) 입력합니다.

1. 정책 이름 왼쪽에서 확인란을 선택합니다.

1. **권한 추가**를 선택합니다.

**Amazon VPC에 함수를 연결하려면 다음을 수행하세요.**

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

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

1. **구성** 탭을 선택한 다음 **VPC**를 선택합니다.

1. **편집**을 선택합니다.

1. **VPC**에서 사용자의 VPC를 선택합니다.

1. **서브넷**에서 사용자의 서브넷을 선택합니다.

1. **보안 그룹**에서 사용자 VPC의 기본 보안 그룹을 선택합니다.

1. **저장**을 선택합니다.

## VPC 피어링 연결 요청 생성
<a name="w2aac35c65c17"></a>

함수의 VPC(요청자 VPC)에서 리소스의 VPC(수락자 VPC)로 VPC 피어링 연결 요청을 생성합니다.

**함수의 VPC에서 VPC 피어링 연결을 요청하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Peering connections**를 선택합니다.

1. **Create peering connection**(피어링 연결 생성)을 선택합니다.

1. **VPC ID(요청자)**에서 함수의 VPC를 선택합니다.

1. **계정 ID**에 리소스 계정의 ID를 입력합니다.

1. **VPC ID(수락자)**에 리소스의 VPC를 입력합니다.

## 리소스 계정 준비
<a name="w2aac35c65c19"></a>

피어링 연결을 생성하고 리소스의 VPC가 연결을 사용하도록 준비하려면 사전 요구 사항에 나열된 권한을 보유하는 역할로 리소스 계정에 로그인합니다. 로그인 단계는 계정 보안 방법에 따라 다를 수 있습니다. AWS 계정에 로그인하는 방법에 대한 자세한 내용은 [AWS Sign-in User Guide](https://docs.aws.amazon.com//signin/latest/userguide/what-is-sign-in.html)를 참조하세요. 리소스 계정에서 다음 절차를 수행하세요.

**VPC 피어링 연결 요청을 수락하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Peering connections**를 선택합니다.

1. 보류 중인 VPC 피어링 연결(상태는 수락 대기 중)을 선택합니다.

1. **작업**을 선택합니다.

1. 드롭다운 목록에서 **요청 수락**을 선택합니다.

1. 확인 메시지가 나타나면 **요청 수락**을 선택합니다.

1. 피어링 연결을 통해 트래픽을 보내고 받을 수 있도록 VPC의 기본 경로 테이블에 대한 경로를 추가하려면 **지금 내 라우팅 테이블 수정**을 선택합니다.

리소스의 VPC에 대한 라우팅 테이블을 검사합니다. Amazon VPC에서 생성된 경로는 리소스의 VPC가 설정된 방식에 따라 연결이 설정되지 않을 수 있습니다. 새 경로와 VPC의 기존 구성 간에 충돌이 있는지 확인합니다. 문제 해결에 대한 자세한 내용은 *Amazon Virtual Private Cloud VPC 피어링 설명서*의 [VPC 피어링 연결 문제 해결](https://docs.aws.amazon.com/vpc/latest/peering/troubleshoot-vpc-peering-connections.html)을 참조하세요.

**리소스의 보안 그룹을 업데이트하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Security groups**를 선택합니다.

1. 리소스에 대한 보안 그룹을 선택합니다.

1. **작업**을 선택합니다.

1. 드롭다운 목록에서 **인바운드 규칙 편집**을 선택합니다.

1. **규칙 추가**를 선택합니다.

1. **소스**에 함수의 계정 ID와 보안 그룹 ID를 슬래시로 구분하여 입력합니다(예: 111122223333/sg-1a2b3c4d).

1. **아웃바운드 규칙 편집**을 선택합니다.

1. 아웃바운드 트래픽이 제한되는지 확인합니다. 기본 VPC 설정은 모든 아웃바운드 트래픽을 허용합니다. 아웃바운드 트래픽이 제한되면 다음 단계로 계속 진행합니다.

1. **규칙 추가**를 선택합니다.

1. **대상**에 함수의 계정 ID와 보안 그룹 ID를 슬래시로 구분하여 입력합니다(예: 111122223333/sg-1a2b3c4d).

1. **규칙 저장**을 선택합니다.

**피어링 연결에 대한 DNS 확인을 활성화하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Peering connections**를 선택합니다.

1. 피어링 연결을 선택합니다.

1. **작업**을 선택합니다.

1. **DNS 설정 편집**을 선택합니다.

1. **수락자 DNS 확인** 아래에서 **요청자 VPC가 수락자 VPC 호스트의 DNS를 프라이빗 IP로 확인하도록 허용**을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

## 함수의 계정에서 VPC 구성 업데이트
<a name="w2aac35c65c21"></a>

함수 계정에 로그인한 다음 VPC 구성을 업데이트합니다.

**VPC 피어링 연결을 위한 경로를 추가하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Route tables**을 선택합니다.

1. 함수와 연결된 서브넷에 대한 라우팅 테이블 이름 옆의 확인란을 선택합니다.

1. **작업**을 선택합니다.

1. **라우팅 편집(Edit routes)**을 선택합니다.

1. **경로 추가**를 선택합니다.

1. **대상**에 리소스 VPC의 CIDR 블록을 입력합니다.

1. **대상**에서 VPC 피어링 연결을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

라우팅 테이블을 업데이트하는 동안 발생할 수 있는 고려 사항에 대한 자세한 내용은 [VPC 피어링 연결을 위한 라우팅 테이블 업데이트](https://docs.aws.amazon.com//vpc/latest/peering/vpc-peering-routing.html)를 참조하세요.

**Lambda 함수의 보안 그룹을 업데이트하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Security groups**를 선택합니다.

1. **작업**을 선택합니다.

1. **인바운드 규칙 편집**을 선택합니다.

1. **규칙 추가**를 선택합니다.

1. **소스**에 리소스의 계정 ID와 보안 그룹 ID를 슬래시로 구분하여 입력합니다(예: 111122223333/sg-1a2b3c4d).

1. **규칙 저장**을 선택합니다.

**피어링 연결에 대한 DNS 확인을 활성화하려면 다음을 수행하세요.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)를 엽니다.

1. 탐색 창에서 **Peering connections**를 선택합니다.

1. 피어링 연결을 선택합니다.

1. **작업**을 선택합니다.

1. **DNS 설정 편집**을 선택합니다.

1. **요청자 DNS 확인** 아래에서 **수락자 VPC가 요청자 VPC 호스트의 DNS를 프라이빗 IP로 확인하도록 허용**을 선택합니다.

1. **변경 사항 저장**을 선택합니다.

## 함수 테스트
<a name="w2aac35c65c23"></a>

**테스트 이벤트를 생성하여 함수의 출력을 검사하려면 다음을 수행하세요.**

1. **코드 소스** 창에서 **테스트**를 선택합니다.

1. **새 이벤트 생성**을 선택합니다.

1. **이벤트 JSON** 패널에서 기본값을 Lambda 함수에 적합한 입력으로 교체합니다.

1. ** 간접 호출**를 선택합니다.

1. **실행 결과** 탭에서 **응답**에 예상 출력이 포함되어 있는지 확인합니다.

또한 함수의 로그를 확인하여 로그가 예상과 일치하는지 확인할 수 있습니다.

**CloudWatch Logs에서 함수의 간접 호출 레코드 보기**

1. **모니터링** 탭을 선택합니다.

1. **CloudWatch 로그 보기**를 선택합니다.

1. **로그 스트림** 탭에서 함수의 간접 호출에 대한 로그 스트림을 선택합니다.

1. 로그가 예상과 일치하는지 확인합니다.

# VPC 연결 Lambda 함수에 대한 인터넷 액세스 활성화
<a name="configuration-vpc-internet"></a>

기본적으로 Lambda 함수는 인터넷에 액세스할 수 있는 Lambda 관리형 VPC에서 실행됩니다. 계정의 VPC에 있는 리소스에 액세스하려면 함수에 VPC 구성을 추가하면 됩니다. 이렇게 하면 VPC가 인터넷에 액세스할 수 없는 경우에는 해당 VPC 내의 리소스로 함수가 제한됩니다. 이 페이지에서는 VPC 연결 Lambda 함수에 인터넷 액세스를 제공하는 방법을 설명합니다.

## 아직 VPC가 없습니다
<a name="new-vpc"></a>

### VPC 생성
<a name="create-vpc-internet"></a>

**VPC 생성 워크플로**는 서브넷, NAT 게이트웨이, 인터넷 게이트웨이, 라우팅 테이블 항목을 포함하여 Lambda 함수가 프라이빗 서브넷에서 퍼블릭 인터넷에 액세스하는 데 필요한 모든 VPC 리소스를 생성합니다.

**VPC를 생성하려면**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. 대시보드에서 **VPC 생성**을 선택합니다.

1. **생성할 리소스**에서 **VPC 등**을 선택합니다.

1. **VPC 구성**

   1. **Name tag auto-generation**(이름 태그 자동 생성)에 VPC의 이름을 입력합니다.

   1. **IPv4 CIDR 블록**에 애플리케이션 또는 네트워크에 필요한 CIDR 블록을 입력하거나 기본 사항을 유지할 수 있습니다.

   1. 애플리케이션이 IPv6 주소를 사용하여 통신하는 경우 **IPv6 CIDR 블록**, 즉 **Amazon에서 제공한 IPv6 CIDR 블록**을 선택합니다.

1. **서브넷 구성**

   1. **가용 영역 수**에서 **2**를 선택합니다. 고가용성을 위해 2개 이상의 AZ를 권장합니다.

   1. **퍼블릭 서브넷 수**는 **2**를 선택합니다.

   1. **프라이빗 서브넷 수**는 **2**를 선택합니다.

   1. 퍼블릭 서브넷에 대한 기본 CIDR 블록을 유지하거나 **서브넷 CIDR 블록 사용자 지정**을 확장하고 CIDR 블록을 입력할 수 있습니다. 자세한 내용은 [서브넷 CIDR 블록](https://docs.aws.amazon.com/vpc/latest/userguide/subnet-sizing.html)을 참조하세요.

1. **NAT 게이트웨이**에서 복원력 향상을 위해 **AZ당 1개**를 선택합니다.

1. **송신 전용 인터넷 게이트웨이**의 경우 IPv6 CIDR 블록을 포함하도록 선택한 경우 **예**를 선택합니다.

1. **VPC 엔드포인트**의 경우 기본값(**S3 게이트웨이**)을 유지합니다. 이 옵션은 비용이 들지 않습니다. 자세한 내용은 [Amazon S3용 VPC 엔드포인트 유형](https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#types-of-vpc-endpoints-for-s3)을 참조하세요.

1. **DNS 옵션**의 경우 기본 설정을 유지합니다.

1. **VPC 생성**을 선택합니다.

### Lambda 함수 구성
<a name="vpc-function-internet-create"></a>

**함수를 생성할 때 VPC를 구성하려면**

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

1. **함수 생성**을 선택합니다.

1. **기본 정보(Basic information)**에서 **함수 이름(Function name)**에 함수 이름을 입력합니다.

1. **Advanced settings(고급 설정)**를 확장합니다.

1. **VPC 활성화**를 선택한 다음 VPC를 선택합니다.

1. (선택 사항) [아웃바운드 IPv6 트래픽](configuration-vpc.md#configuration-vpc-ipv6)을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택합니다.

1. **서브넷**의 경우 모든 프라이빗 서브넷을 선택합니다. 프라이빗 서브넷은 NAT 게이트웨이를 통해 인터넷에 액세스할 수 있습니다. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스가 제공되지는 않습니다.
**참고**  
**듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.

1. **보안 그룹**에서 아웃바운드 트래픽을 허용하는 보안 그룹을 선택합니다.

1. **함수 생성**을 선택합니다.

Lambda는 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 관리형 정책을 사용하여 실행 역할을 자동으로 생성합니다. 이 정책의 권한은 VPC 구성을 위한 탄력적 네트워크 인터페이스를 생성하는 데만 필요하며, 함수를 간접 호출하는 데는 필요하지 않습니다. 최소 권한의 권한을 적용하려면 함수 및 VPC 구성을 생성한 후 실행 역할에서 **AWSLambdaVPCAccessExecutionRole** 정책을 제거하면 됩니다. 자세한 내용은 [필수 IAM 권한](configuration-vpc.md#configuration-vpc-permissions) 섹션을 참조하세요.

**기존 함수에 대한 VPC를 구성하려면**

기존 함수에 VPC 구성을 추가하려면 함수의 실행 역할에 [ 탄력적 네트워크 인터페이스를 생성하고 관리할 수 있는 권한](configuration-vpc.md#configuration-vpc-permissions)이 있어야 합니다. [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 관리형 정책에는 필요한 권한이 포함되어 있습니다. 최소 권한의 권한을 적용하려면 VPC 구성을 생성한 후 실행 역할에서 **AWSLambdaVPCAccessExecutionRole** 정책을 제거하면 됩니다.

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

1. 함수를 선택합니다.

1. **구성** 탭을 선택한 다음 **VPC**를 선택합니다.

1. **VPC**에서 **편집**을 선택합니다.

1. VPC를 선택합니다.

1. (선택 사항) [아웃바운드 IPv6 트래픽](configuration-vpc.md#configuration-vpc-ipv6)을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택합니다.

1. **서브넷**의 경우 모든 프라이빗 서브넷을 선택합니다. 프라이빗 서브넷은 NAT 게이트웨이를 통해 인터넷에 액세스할 수 있습니다. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스가 제공되지는 않습니다.
**참고**  
**듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.

1. **보안 그룹**에서 아웃바운드 트래픽을 허용하는 보안 그룹을 선택합니다.

1. **저장**을 선택합니다.

### 함수 테스트
<a name="vpc-function-internet-test"></a>

다음 샘플 코드를 사용하여 VPC 연결 함수가 퍼블릭 인터넷에 연결할 수 있는지 확인하세요. 성공하면 코드가 `200` 상태 코드를 반환합니다. 실패하면 함수가 제한 시간을 초과합니다.

------
#### [ Node.js ]

1. Lambda 콘솔의 **코드 소스** 창에서 **index.mjs** 파일에 다음 코드를 붙여넣습니다. 이 함수는 퍼블릭 엔드포인트에 HTTP GET 요청을 하고 HTTP 응답 코드를 반환하여 함수가 퍼블릭 인터넷에 액세스할 수 있는지 테스트합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/code-source-nodejs.png)  
**Example - async/await를 사용한 HTTP 요청**  

   ```
   const url = "https://aws.amazon.com/";
   
   export const handler = async(event) => {
       try {
           const res = await fetch(url);
           console.info("status", res.status);
           return res.status;
       }
       catch (e) {
           console.error(e);
           return 500;
       }
   };
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **테스트** 탭을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-tab.png)

1. **테스트**를 선택합니다.

1. 함수가 `200` 상태 코드를 반환합니다. 이는 해당 함수에 아웃바운드 인터넷 액세스 권한이 있음을 의미합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-successful-200.png)

   함수가 퍼블릭 인터넷에 연결할 수 없으면 다음과 같은 오류 메시지가 표시됩니다.

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------
#### [ Python ]

1. Lambda 콘솔의 **코드 소스** 창에서 **lambda\$1function.py** 파일에 다음 코드를 붙여넣습니다. 이 함수는 퍼블릭 엔드포인트에 HTTP GET 요청을 하고 HTTP 응답 코드를 반환하여 함수가 퍼블릭 인터넷에 액세스할 수 있는지 테스트합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/code-source-python.png)

   ```
   import urllib.request
   
   def lambda_handler(event, context):
       try:
           response = urllib.request.urlopen('https://aws.amazon.com')
           status_code = response.getcode()
           print('Response Code:', status_code)
           return status_code
       except Exception as e:
           print('Error:', e)
           raise e
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **테스트** 탭을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-tab.png)

1. **테스트**를 선택합니다.

1. 함수가 `200` 상태 코드를 반환합니다. 이는 해당 함수에 아웃바운드 인터넷 액세스 권한이 있음을 의미합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-successful-200.png)

   함수가 퍼블릭 인터넷에 연결할 수 없으면 다음과 같은 오류 메시지가 표시됩니다.

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------

## 이미 VPC가 있습니다
<a name="existing-vpc"></a>

이미 VPC가 있지만 Lambda 함수에 대한 퍼블릭 인터넷 액세스를 구성해야 하는 경우 다음 단계를 따르세요. 이 절차에서는 VPC에 서브넷이 2개 이상 있다고 가정합니다. 서브넷 2개가 없는 경우 **Amazon VPC 사용 설명서의 [서브넷 생성](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)을 참조하세요.

### 라우팅 테이블 구성 확인
<a name="vpc-internet-routes"></a>

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. **VPC ID**를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/vpc-id.png)

1. 아래로 스크롤하여 **리소스 맵** 섹션으로 이동합니다. 라우팅 테이블 매핑에 유의하세요. 서브넷에 매핑된 각각의 라우팅 테이블을 엽니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/route-table-associations.png)

1. 아래로 스크롤하여 **라우팅** 탭으로 이동합니다. 경로를 검토하여 VPC에 다음과 같은 라우팅 테이블이 둘 다 있는지 확인합니다. 이러한 각 요구 사항은 별도의 라우팅 테이블을 통해 충족되어야 합니다.
   + 인터넷 바운드 트래픽(IPv4의 경우 `0.0.0.0/0`, IPv6의 경우 `::/0`)은 인터넷 게이트웨이(`igw-xxxxxxxxxx`)로 라우팅됩니다. 이는 라우팅 테이블과 연결된 서브넷이 퍼블릭 서브넷임을 의미합니다.
**참고**  
서브넷에 IPv6 CIDR 블록이 없는 경우 IPv4 라우팅(`0.0.0.0/0`)만 표시됩니다.  
**Example 퍼블릭 서브넷 라우팅 테이블**    
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/routes-public.png)
   + IPv4(`0.0.0.0/0`)에 대한 인터넷에 바인딩된 트래픽은 퍼블릭 서브넷과 연결된 NAT 게이트웨이(`nat-xxxxxxxxxx`)로 라우팅됩니다. 이는 해당 서브넷이 NAT 게이트웨이를 통해 인터넷에 액세스할 수 있는 프라이빗 서브넷임을 의미합니다.
**참고**  
서브넷에 IPv6 CIDR 블록이 있는 경우 라우팅 테이블은 인터넷에 바인딩된 IPv6 트래픽(`::/0`)도 송신 전용 인터넷 게이트웨이(`eigw-xxxxxxxxxx`)로 라우팅해야 합니다. 서브넷에 IPv6 CIDR 블록이 없는 경우 IPv4 라우팅(`0.0.0.0/0`)만 표시됩니다.  
**Example 프라이빗 서브넷 라우팅 테이블**    
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/routes-private.png)

1. VPC의 서브넷과 연결된 각 라우팅 테이블을 검토하고 인터넷 게이트웨이가 있는 라우팅 테이블과 NAT 게이트웨이가 있는 라우팅 테이블이 있음을 확인할 때까지 이전 단계를 반복합니다.

   라우팅 테이블 2개(인터넷 게이트웨이에 대한 라우팅이 있는 라우팅 테이블과 NAT 게이트웨이에 대한 라우팅이 있는 라우팅 테이블)가 없는 경우 다음 단계에 따라 누락된 리소스와 라우팅 테이블 항목을 생성합니다.

### 라우팅 테이블 생성
<a name="create-route-table"></a>

라우팅 테이블을 생성하고 이를 서브넷과 연결하려면 다음 단계를 따르세요.

**Amazon VPC 콘솔을 사용하여 사용자 지정 라우팅 테이블을 생성하려면 다음을 수행합니다.**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. 탐색 창에서 **Route tables**을 선택합니다.

1. **라우팅 테이블 생성**을 선택합니다.

1. (선택 사항) **이름(Name)**에 라우팅 테이블의 이름을 입력합니다.

1. **VPC**에서 VPC를 선택합니다.

1. (선택 사항) 태그를 추가하려면 **새 태그 추가(Add new tag)**를 선택하고 태그 키와 태그 값을 입력합니다.

1. **라우팅 테이블 생성**을 선택합니다.

1. [**서브넷 연결(Subnet associations)**] 탭에서 [**서브넷 연결 편집(Edit subnet associations)**]을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/route-table-subnet.png)

1. 라우팅 테이블과 연결할 서브넷에 대한 확인란을 선택합니다.

1. [**연결 저장(Save associations)**]을 선택합니다.

### 인터넷 게이트웨이 생성
<a name="create-igw"></a>

다음 단계에 따라 인터넷 게이트웨이를 생성하고, 이를 VPC에 연결하고, 퍼블릭 서브넷의 라우팅 테이블에 추가합니다.

**인터넷 게이트웨이를 생성하려면**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. 탐색 창에서 **인터넷 게이트웨이(Internet gateways)**를 선택합니다.

1. **인터넷 게이트웨이 생성**을 선택합니다.

1. (선택 사항) 인터넷 게이트웨이에 이름을 입력합니다.

1. (선택 사항) 태그를 추가하려면 **Add new tag**(새 태그 추가)를 선택하고 태그 키와 태그 값을 입력합니다.

1. **인터넷 게이트웨이 생성**을 선택합니다.

1. 화면 상단의 배너에서 **VPC에 연결**을 선택하고 사용 가능한 VPC를 선택한 다음 **인터넷 게이트웨이 연결**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/igw-attach-vpc.png)

1. **VPC ID**를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/igw-subnet-1.png)

1. **VPC ID**를 다시 선택하여 VPC 세부 정보 페이지를 엽니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/igw-your-vpcs.png)

1. 아래로 스크롤하여 **리소스 맵**으로 이동한 다음 서브넷을 선택합니다. 서브넷 세부 정보가 새 탭에 표시됩니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/vpc-subnets.png)

1. **라우팅 테이블**에서 링크를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/subnet-route-table.png)

1. **라우팅 테이블 ID**를 선택하여 라우팅 테이블 세부 정보 페이지를 엽니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/route-table-id.png)

1. **라우팅**에서 **라우팅 편집**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/edit-routes.png)

1. **라우팅 추가**를 선택한 다음 **대상** 상자에 `0.0.0.0/0`을 입력합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/create-route-1.png)

1. **대상**에서 **인터넷 게이트웨이**를 선택한 다음 이전에 생성한 인터넷 게이트웨이를 선택합니다. 서브넷에 IPv6 CIDR 블록이 있는 경우 동일한 인터넷 게이트웨이에 `::/0`에 대한 라우팅도 추가해야 합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/create-route-2.png)

1. **변경 사항 저장**을 선택합니다.

### NAT 게이트웨이 만들기
<a name="create-nat-gateway"></a>

다음 단계에 따라 NAT 게이트웨이를 생성하고 이를 퍼블릭 서브넷과 연결한 다음 프라이빗 서브넷의 라우팅 테이블에 추가합니다.

**NAT 게이트웨이를 생성하고 이를 퍼블릭 서브넷과 연결하려면 다음을 수행합니다.**

1. 탐색 창에서 **NAT 게이트웨이**를 선택합니다.

1. **NAT 게이트웨이 생성**을 선택합니다.

1. (선택 사항) NAT 게이트웨이에 이름을 입력합니다.

1. **서브넷**에서 VPC의 퍼블릭 서브넷을 선택합니다. (퍼블릭 서브넷은 라우팅 테이블에 인터넷 게이트웨이에 대한 직접 라우팅이 있는 서브넷입니다.)
**참고**  
NAT 게이트웨이는 퍼블릭 서브넷과 연결되어 있지만 라우팅 테이블 항목은 프라이빗 서브넷에 있습니다.

1. **탄력적 IP 할당 ID**에서 탄력적 IP 주소를 선택하거나 **탄력적 IP 할당**을 선택합니다.

1. **NAT 게이트웨이 생성**을 선택합니다.

**프라이빗 서브넷의 라우팅 테이블에 있는 NAT 게이트웨이에 라우팅을 추가하려면 다음을 수행합니다.**

1. 탐색 창에서 **Subnets**를 선택합니다.

1. VPC에서 프라이빗 서브넷을 선택합니다. (프라이빗 서브넷은 라우팅 테이블에 인터넷 게이트웨이에 대한 라우팅이 없는 서브넷입니다.)

1. **라우팅 테이블**에서 링크를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/subnet-route-table.png)

1. **라우팅 테이블 ID**를 선택하여 라우팅 테이블 세부 정보 페이지를 엽니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/route-table-id.png)

1. 아래로 스크롤하여 **라우팅** 탭을 선택한 다음 **라우팅 편집**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/route-table-edit-routes.png)

1. **라우팅 추가**를 선택한 다음 **대상** 상자에 `0.0.0.0/0`을 입력합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/create-route-1.png)

1. **대상**에서 **NAT 게이트웨이**를 선택한 다음 이전에 생성한 NAT 게이트웨이를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/create-route-nat.png)

1. **변경 사항 저장**을 선택합니다.

### 송신 전용 인터넷 게이트웨이 생성(IPv6 전용)
<a name="create-egress-gateway"></a>

송신 전용 인터넷 게이트웨이를 생성하고 프라이빗 서브넷의 라우팅 테이블에 추가하려면 다음 단계를 따르세요.

**외부 전용 인터넷 게이트웨이를 생성하려면**

1. 탐색 창에서 **송신 전용 인터넷 게이트웨이**를 선택합니다.

1. **송신 전용 인터넷 게이트웨이 생성**을 선택합니다.

1. (선택 사항) 이름을 입력합니다.

1. 외부 전용 인터넷 게이트웨이를 생성할 VPC를 선택합니다.

1. **송신 전용 인터넷 게이트웨이 생성**을 선택합니다.

1. **연결된 VPC ID**에서 링크를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/eigw-details.png)

1. **VPC ID** 아래의 링크를 선택하여 VPC 세부 정보 페이지를 엽니다.

1. 아래로 스크롤하여 **리소스 맵**으로 이동한 다음 프라이빗 서브넷을 선택합니다. (프라이빗 서브넷은 라우팅 테이블에 인터넷 게이트웨이에 대한 라우팅이 없는 서브넷입니다.) 서브넷 세부 정보가 새 탭에 표시됩니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/vpc-subnet-private.png)

1. **라우팅 테이블**에서 링크를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/private-subnet-route-table.png)

1. **라우팅 테이블 ID**를 선택하여 라우팅 테이블 세부 정보 페이지를 엽니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/route-table-id.png)

1. **라우팅**에서 **라우팅 편집**을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/edit-routes.png)

1. **라우팅 추가**를 선택한 다음 **대상** 상자에 `::/0`을 입력합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/create-route-1.png)

1. **대상**에서 **송신 전용 인터넷 게이트웨이**를 선택한 다음 이전에 생성한 게이트웨이를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/eigw-route.png)

1. **변경 사항 저장**을 선택합니다.

### Lambda 함수 구성
<a name="vpc-function-internet-create-existing"></a>

**함수를 생성할 때 VPC를 구성하려면**

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

1. **함수 생성**을 선택합니다.

1. **기본 정보(Basic information)**에서 **함수 이름(Function name)**에 함수 이름을 입력합니다.

1. **Advanced settings(고급 설정)**를 확장합니다.

1. **VPC 활성화**를 선택한 다음 VPC를 선택합니다.

1. (선택 사항) [아웃바운드 IPv6 트래픽](configuration-vpc.md#configuration-vpc-ipv6)을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택합니다.

1. **서브넷**의 경우 모든 프라이빗 서브넷을 선택합니다. 프라이빗 서브넷은 NAT 게이트웨이를 통해 인터넷에 액세스할 수 있습니다. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스가 제공되지는 않습니다.
**참고**  
**듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.

1. **보안 그룹**에서 아웃바운드 트래픽을 허용하는 보안 그룹을 선택합니다.

1. **함수 생성**을 선택합니다.

Lambda는 [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 관리형 정책을 사용하여 실행 역할을 자동으로 생성합니다. 이 정책의 권한은 VPC 구성을 위한 탄력적 네트워크 인터페이스를 생성하는 데만 필요하며, 함수를 간접 호출하는 데는 필요하지 않습니다. 최소 권한의 권한을 적용하려면 함수 및 VPC 구성을 생성한 후 실행 역할에서 **AWSLambdaVPCAccessExecutionRole** 정책을 제거하면 됩니다. 자세한 내용은 [필수 IAM 권한](configuration-vpc.md#configuration-vpc-permissions) 섹션을 참조하세요.

**기존 함수에 대한 VPC를 구성하려면**

기존 함수에 VPC 구성을 추가하려면 함수의 실행 역할에 [ 탄력적 네트워크 인터페이스를 생성하고 관리할 수 있는 권한](configuration-vpc.md#configuration-vpc-permissions)이 있어야 합니다. [AWSLambdaVPCAccessExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaVPCAccessExecutionRole.html) AWS 관리형 정책에는 필요한 권한이 포함되어 있습니다. 최소 권한의 권한을 적용하려면 VPC 구성을 생성한 후 실행 역할에서 **AWSLambdaVPCAccessExecutionRole** 정책을 제거하면 됩니다.

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

1. 함수를 선택합니다.

1. **구성** 탭을 선택한 다음 **VPC**를 선택합니다.

1. **VPC**에서 **편집**을 선택합니다.

1. VPC를 선택합니다.

1. (선택 사항) [아웃바운드 IPv6 트래픽](configuration-vpc.md#configuration-vpc-ipv6)을 허용하려면 **듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택합니다.

1. **서브넷**의 경우 모든 프라이빗 서브넷을 선택합니다. 프라이빗 서브넷은 NAT 게이트웨이를 통해 인터넷에 액세스할 수 있습니다. 함수를 퍼블릭 서브넷에 연결해도 인터넷 액세스가 제공되지는 않습니다.
**참고**  
**듀얼 스택 서브넷에 IPv6 트래픽 허용**을 선택한 경우 선택한 모든 서브넷에 IPv4 CIDR 블록 및 IPv6 CIDR 블록이 있어야 합니다.

1. **보안 그룹**에서 아웃바운드 트래픽을 허용하는 보안 그룹을 선택합니다.

1. **저장**을 선택합니다.

### 함수 테스트
<a name="vpc-function-internet-test-existing"></a>

다음 샘플 코드를 사용하여 VPC 연결 함수가 퍼블릭 인터넷에 연결할 수 있는지 확인하세요. 성공하면 코드가 `200` 상태 코드를 반환합니다. 실패하면 함수가 제한 시간을 초과합니다.

------
#### [ Node.js ]

1. Lambda 콘솔의 **코드 소스** 창에서 **index.mjs** 파일에 다음 코드를 붙여넣습니다. 이 함수는 퍼블릭 엔드포인트에 HTTP GET 요청을 하고 HTTP 응답 코드를 반환하여 함수가 퍼블릭 인터넷에 액세스할 수 있는지 테스트합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/code-source-nodejs.png)  
**Example - async/await를 사용한 HTTP 요청**  

   ```
   const url = "https://aws.amazon.com/";
   
   export const handler = async(event) => {
       try {
           const res = await fetch(url);
           console.info("status", res.status);
           return res.status;
       }
       catch (e) {
           console.error(e);
           return 500;
       }
   };
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **테스트** 탭을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-tab.png)

1. **테스트**를 선택합니다.

1. 함수가 `200` 상태 코드를 반환합니다. 이는 해당 함수에 아웃바운드 인터넷 액세스 권한이 있음을 의미합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-successful-200.png)

   함수가 퍼블릭 인터넷에 연결할 수 없으면 다음과 같은 오류 메시지가 표시됩니다.

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------
#### [ Python ]

1. Lambda 콘솔의 **코드 소스** 창에서 **lambda\$1function.py** 파일에 다음 코드를 붙여넣습니다. 이 함수는 퍼블릭 엔드포인트에 HTTP GET 요청을 하고 HTTP 응답 코드를 반환하여 함수가 퍼블릭 인터넷에 액세스할 수 있는지 테스트합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/code-source-python.png)

   ```
   import urllib.request
   
   def lambda_handler(event, context):
       try:
           response = urllib.request.urlopen('https://aws.amazon.com')
           status_code = response.getcode()
           print('Response Code:', status_code)
           return status_code
       except Exception as e:
           print('Error:', e)
           raise e
   ```

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

1. **테스트** 탭을 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-tab.png)

1. **테스트**를 선택합니다.

1. 함수가 `200` 상태 코드를 반환합니다. 이는 해당 함수에 아웃바운드 인터넷 액세스 권한이 있음을 의미합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-successful-200.png)

   함수가 퍼블릭 인터넷에 연결할 수 없으면 다음과 같은 오류 메시지가 표시됩니다.

   ```
   {
     "errorMessage": "2024-04-11T17:22:20.857Z abe12jlc-640a-8157-0249-9be825c2y110 Task timed out after 3.01 seconds"
   }
   ```

------

# Lambda용 인바운드 인터페이스 VPC 엔드포인트 연결
<a name="configuration-vpc-endpoints"></a>

Amazon Virtual Private Cloud(Amazon VPC)를 사용하여 AWS 리소스를 호스팅하는 경우, VPC와 Lambda 간에 연결을 설정할 수 있습니다. 이 연결을 사용하여 공용 인터넷을 통과하지 않고 Lambda 함수를 간접 호출할 수 있습니다.

VPC와 Lambda 간에 프라이빗 연결을 설정하려면 [인터페이스 VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)를 생성합니다. 인터페이스 엔드포인트는 인터넷 게이트웨이, NAT 디바이스, VPN 연결 또는 AWS Direct Connect 연결 없이 비공개로 Lambda API에 액세스할 수 있도록 지원하는 [AWS PrivateLink](https://aws.amazon.com/privatelink)에 의해 구동됩니다. VPC의 인스턴스는 Lambda API와 통신하는 데 퍼블릭 IP 주소가 필요하지 않습니다. VPC와 Lambda 간의 트래픽은 AWS 네트워크를 벗어나지 않습니다.

각 인터페이스 엔드포인트는 서브넷에서 하나 이상의 [탄력적 네트워크 인터페이스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html)로 표현됩니다. 네트워크 인터페이스는 트래픽에 대한 진입점 역할을 하는 프라이빗 IP 주소를 Lambda에 제공합니다.

**Topics**
+ [Lambda 인터페이스 엔드포인트의 고려 사항](#vpc-endpoint-considerations)
+ [Lambda에 대한 인터페이스 엔드포인트 생성](#vpc-endpoint-create)
+ [Lambda에 대한 인터페이스 엔드포인트 정책 생성](#vpc-endpoint-policy)

## Lambda 인터페이스 엔드포인트의 고려 사항
<a name="vpc-endpoint-considerations"></a>

Lambda에 대한 인터페이스 엔드포인트를 설정하기 전에 *Amazon VPC 사용 설명서*에서 [인터페이스 엔드포인트 속성 및 제한 사항](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations)을 검토해야 합니다.

VPC에서 모든 Lambda API 작업을 호출할 수 있습니다. 예를 들어 VPC 내에서 `Invoke` API를 간접 호출하여 Lambda 함수를 간접 호출할 수 있습니다. Lambda API의 전체 목록은 Lambda API 참조의 [작업](https://docs.aws.amazon.com/lambda/latest/dg/API_Operations.html)을 참조하세요.

`use1-az3`은 Lambda VPC 함수를 위한 제한된 용량 리전입니다. 이 가용 영역의 서브넷을 Lambda 함수와 함께 사용해서는 안 됩니다. 이렇게 하면 운영 중단 시 영역 중복성이 감소할 수 있기 때문입니다.

### 지속적인 연결을 위한 연결 유지
<a name="vpc-endpoint-considerations-keepalive"></a>

Lambda는 시간이 지남에 따라 유휴 연결을 제거하므로 지속적인 연결을 유지하려면 연결 유지 지시문을 사용해야 합니다. 함수를 호출할 때 유휴 연결을 재사용하려고 하면 연결 오류가 발생합니다. 지속적인 연결을 유지하려면 런타임과 관련된 연결 유지 지시문을 사용하세요. 예를 들어 *AWS SDK for JavaScript 개발자 안내서*의 [Node.js에서 연결 유지로 연결 재사용](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html)을 참조하세요.

### 청구 고려 사항
<a name="vpc-endpoint-considerations-billing"></a>

인터페이스 엔드포인트를 통해 Lambda 함수에 액세스하는 데는 추가 비용이 발생하지 않습니다. Lambda 요금에 대한 자세한 내용은 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하세요.

AWS PrivateLink의 표준 요금이 Lambda의 인터페이스 엔드포인트에 적용됩니다. 각 가용 영역에서 인터페이스 엔드포인트가 프로비저닝된 각 시간과 인터페이스 엔드포인트를 통해 처리된 데이터에 대해 AWS 계정에 요금이 청구됩니다. 인터페이스 엔드포인트 요금에 대한 자세한 내용은 [AWS PrivateLink 요금](https://aws.amazon.com/privatelink/pricing/)을 참조하세요.

### VPC 피어링 고려 사항
<a name="vpc-endpoint-considerations-peering"></a>

[VPC 피어링](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)을 사용하여 인터페이스 엔드포인트가 있는 VPC에 다른 VPC를 연결할 수 있습니다. VPC 피어링은 두 VPC 간의 네트워킹 연결입니다. 사용자의 자체 두 VPC 간에 또는 다른 AWS 계정의 VPC와 VPC 피어링 연결을 설정할 수 있습니다. VPC는 두 개의 서로 다른 AWS 리전에 있을 수도 있습니다.

피어링된 VPC 간의 트래픽은 AWS 네트워크에 유지되며 공용 인터넷을 통과하지 않습니다. VPC가 피어링되면 두 VPC의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, Amazon Relational Database Service(Amazon RDS) 인스턴스 또는 VPC 지원 Lambda 함수와 같은 리소스는 VPC 중 하나에서 생성된 인터페이스 엔드포인트를 통해 Lambda API에 액세스할 수 있습니다.

## Lambda에 대한 인터페이스 엔드포인트 생성
<a name="vpc-endpoint-create"></a>

Amazon VPC 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 Lambda에 대한 인터페이스 엔드포인트를 생성할 수 있습니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [인터페이스 엔드포인트 생성](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#create-interface-endpoint)을 참조하세요.

**Lambda에 대한 인터페이스 엔드포인트를 생성하려면(콘솔)**

1. Amazon VPC 콘솔의[ 엔드포인트 페이지](https://console.aws.amazon.com/vpc/home?#Endpoints)를 엽니다.

1. **엔드포인트 생성**을 선택합니다.

1. **서비스 카테고리**에서 **AWS 서비스**가 선택되어 있는지 확인하세요.

1. **서비스 이름**에 **com.amazonaws.*region*.lambda**를 선택합니다. **유형**이 **인터페이스**인지 확인합니다.

1. VPC와 서브넷을 선택합니다.

1. 인터페이스 엔드포인트에 대한 프라이빗 DNS를 활성화하려면 **DNS 이름 활성화** 확인란을 선택합니다. AWS 서비스용 VPC 엔드포인트에 프라이빗 DNS 이름을 사용하는 것이 좋습니다. 이렇게 하면 AWS SDK를 통해 이루어진 요청과 같이 퍼블릭 서비스 엔드포인트를 사용하는 요청이 VPC 엔드포인트로 확인됩니다.

1. **보안 그룹**에서 하나 이상의 보안 그룹을 선택합니다.

1. **Create endpoint**(엔드포인트 생성)을 선택합니다.

프라이빗 DNS 옵션을 사용하려면 VPC의 `enableDnsHostnames` 및 `enableDnsSupportattributes`를 설정해야 합니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [VPC에 대한 DNS 지원 보기 및 업데이트](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-updating)를 참조하세요. 인터페이스 엔드포인트에 프라이빗 DNS를 사용하도록 설정하는 경우, 리전에 대한 기본 DNS 이름(예: `lambda.us-east-1.amazonaws.com`)을 사용하여 Lambda에 API 요청을 할 수 있습니다. 서비스 엔드포인트에 대한 자세한 내용은 *AWS 일반 참조*의 [서비스 엔드포인트 및 할당량](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)을 참조하세요.

자세한 내용은 *Amazon VPC 사용 설명서*의 [인터페이스 엔드포인트를 통해 서비스 액세스](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#access-service-though-endpoint)를 참조하세요.

CloudFormation을 사용하여 엔드포인트를 생성하고 구성하는 방법에 대한 자세한 내용은 *AWS CloudFormation 사용 설명서*의 [AWS::EC2::VPCEndpoint](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html) 리소스를 참조하세요.

**Lambda에 대한 인터페이스 엔드포인트를 생성하려면(AWS CLI)**  
[create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html) 명령을 사용하여 엔드포인트 네트워크 인터페이스와 연결할 VPC ID, VPC 엔드포인트 유형(인터페이스), 서비스 이름, 엔드포인트를 사용할 서브넷 및 보안 그룹을 지정합니다. 예제:

```
aws ec2 create-vpc-endpoint 
  --vpc-id vpc-ec43eb89
  --vpc-endpoint-type Interface
  --service-name com.amazonaws.us-east-1.lambda
  --subnet-id subnet-abababab
  --security-group-id sg-1a2b3c4d
```

## Lambda에 대한 인터페이스 엔드포인트 정책 생성
<a name="vpc-endpoint-policy"></a>

인터페이스 엔드포인트를 사용할 수 있는 사용자와 사용자가 액세스할 수 있는 Lambda 함수를 제어하기 위해 엔드포인트에 엔드포인트 정책을 연결할 수 있습니다. 이 정책은 다음 정보를 지정합니다.
+ 작업을 수행할 수 있는 보안 주체.
+ 보안 주체가 수행할 수 있는 작업입니다.
+ 보안 주체가 작업을 수행할 수 있는 리소스입니다.

자세한 내용은 *Amazon VPC 사용 설명서*의 [VPC 엔드포인트를 통해 서비스에 대한 액세스 제어](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)를 참조하세요.

**예: Lambda 작업에 대한 인터페이스 엔드포인트 정책**  
다음은 Lambda에 대한 엔드포인트 정책의 예입니다. 엔드포인트에 연결된 경우 이 정책을 통해 사용자 `MyUser`가 `my-function` 함수를 간접 호출할 수 있습니다.

**참고**  
리소스에 정규화된 함수 ARN과 정규화되지 않은 함수 ARN을 모두 포함해야 합니다.

```
{
   "Statement":[
      {
         "Principal":
         { 
             "AWS": "arn:aws:iam::111122223333:user/MyUser" 
         },
         "Effect":"Allow",
         "Action":[
            "lambda:InvokeFunction"
         ],
         "Resource": [
               "arn:aws:lambda:us-east-2:123456789012:function:my-function",
               "arn:aws:lambda:us-east-2:123456789012:function:my-function:*"
            ]
      }
   ]
}
```

# Lambda 함수에 대한 파일 시스템 액세스 구성
<a name="configuration-filesystem"></a>

Amazon Elastic File System(Amazon EFS) 파일 시스템을 로컬 디렉터리에 마운트하도록 함수를 구성할 수 있습니다. Amazon EFS를 사용하면 함수 코드가 안전하고 높은 동시성으로 공유 리소스에 액세스하여 수정할 수 있습니다.

## 지원되는 리전
<a name="configuration-filesystem-supported-regions"></a>

Amazon EFS for Lambda는 아시아 태평양(뉴질랜드), 아시아 태평양(타이베이), 아시아 태평양(말레이시아), 멕시코(중부), 아시아 태평양(태국), 캐나다 서부(캘거리)를 제외한 모든 [상용 리전](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#region)에서 사용할 수 있습니다.

**Topics**
+ [지원되는 리전](#configuration-filesystem-supported-regions)
+ [실행 역할 및 사용자 권한](#configuration-filesystem-permissions)
+ [파일 시스템 및 액세스 포인트 구성](#configuration-filesystem-setup)
+ [파일 시스템에 연결(콘솔)](#configuration-filesystem-config)

## 실행 역할 및 사용자 권한
<a name="configuration-filesystem-permissions"></a>

파일 시스템에 사용자 구성 AWS Identity and Access Management(IAM) 정책이 없는 경우, EFS는 파일 시스템 탑재 대상을 사용하여 파일 시스템에 연결할 수 있는 모든 클라이언트에 대한 모든 액세스 권한을 부여하는 기본 정책을 사용합니다. 파일 시스템에 사용자 구성 IAM 정책이 있는 경우 함수의 실행 역할에 올바른 `elasticfilesystem` 권한이 있어야 합니다.

**실행 역할 권한**
+ **elasticfilesystem:ClientMount**
+ **elasticfilesystem:ClientWrite(읽기 전용 연결에는 필요하지 않음)**

이러한 권한은 **AmazonElasticFileSystemClientReadWriteAccess** 관리형 정책에 포함되어 있습니다. 또한 실행 역할에는 [파일 시스템의 VPC에 연결하는 데 필요한 권한](configuration-vpc.md#configuration-vpc-permissions)도 있어야 합니다.

파일 시스템을 구성할 때 Lambda는 권한을 사용하여 마운트 대상을 확인합니다. 파일 시스템에 연결되도록 함수를 구성하려면 사용자에게 다음 권한이 필요합니다.

**사용자 권한**
+ **elasticfilesystem:DescribeMountTargets**

## 파일 시스템 및 액세스 포인트 구성
<a name="configuration-filesystem-setup"></a>

함수가 연결되는 모든 가용 영역에 마운트 대상이 있는 Amazon EFS에서 파일 시스템을 생성합니다. 성능 및 복원력을 위해 최소 두 개의 가용 영역을 사용합니다. 예를 들어, 간단한 구성에서 별도의 가용 영역에 두 개의 프라이빗 서브넷이 있는 VPC를 가질 수 있습니다. 이 함수는 두 서브넷에 모두 연결되며 각 서브넷에서 마운트 대상을 사용할 수 있습니다. 함수와 마운트 대상에서 사용되는 보안 그룹에서 NFS 트래픽(포트 2049)을 허용하는지 확인합니다.

**참고**  
파일 시스템을 생성할 때 나중에 변경할 수 없는 성능 모드를 선택합니다. **범용** 모드는 지연 시간이 짧으며 **최대 I/O** 모드는 더 높은 최대 처리량과 IOPS를 지원합니다. 선택에 관한 도움말은 *Amazon Elastic File System 사용 설명서*의 [Amazon EFS 성능](https://docs.aws.amazon.com/efs/latest/ug/performance.html)을 참조하세요.

액세스 포인트는 함수의 각 인스턴스를 연결된 가용 영역에 대한 올바른 마운트 대상에 연결합니다. 최상의 성능을 위해 루트가 아닌 경로를 사용하여 액세스 포인트를 생성하고 각 디렉터리에서 생성되는 파일 수를 제한합니다. 다음 예제에서는 파일 시스템에 `my-function`라는 디렉터리를 생성하고 소유자 ID를 표준 디렉터리 권한(755)으로 1001로 설정합니다.

**Example 액세스 포인트 구성**  
+ **이름** – `files`
+ **사용자 ID** – `1001`
+ **그룹 ID** – `1001`
+ **경로** – `/my-function`
+ **권한** – `755`
+ **소유자 사용자 ID** – `1001`
+ **그룹 사용자 ID** – `1001`

함수가 액세스 포인트를 사용할 때 사용자 ID 1001이 지정되고, 디렉터리에 대한 전체 액세스 권한을 가집니다.

자세한 내용은 *Amazon Elastic File System 사용 설명서*의 다음 항목을 참조하세요.
+ [Amazon EFS를 위한 리소스 생성](https://docs.aws.amazon.com/efs/latest/ug/creating-using.html)
+ [사용자, 그룹 및 권한 작업](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs-nfs-permissions.html)

## 파일 시스템에 연결(콘솔)
<a name="configuration-filesystem-config"></a>

함수는 VPC의 로컬 네트워크를 통해 파일 시스템에 연결됩니다. 함수가 연결되는 서브넷은 파일 시스템의 마운트 지점을 포함하는 동일한 서브넷이거나 NFS 트래픽(포트 2049)을 파일 시스템으로 라우팅할 수 있는 동일한 가용 영역의 서브넷일 수 있습니다.

**참고**  
함수가 VPC에 아직 연결되어 있지 않은 경우 [Lambda 함수에 Amazon VPC의 리소스에 대한 액세스 권한 부여](configuration-vpc.md) 단원을 참조하세요.

**파일 시스템 액세스를 구성하려면**

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

1. 함수를 선택합니다.

1. **구성(Configuration)**을 선택한 다음 **파일 시스템(File systems)**을 선택합니다.

1. **파일 시스템**에서 **파일 시스템 추가**를 선택합니다.

1. 다음 속성을 구성합니다.
   + **EFS 파일 시스템** – 동일한 VPC에 있는 파일 시스템에 대한 액세스 포인트입니다.
   + **로컬 마운트 경로** - 파일 시스템이 Lambda 함수에서 마운트되는 위치로, `/mnt/`로 시작합니다.

**요금**  
Amazon EFS는 스토리지 및 처리량에 대해 요금을 청구하며, 요율은 스토리지 클래스에 따라 달라집니다. 자세한 내용은 [Amazon EFS 요금](https://aws.amazon.com/efs/pricing)을 참조하세요.  
Lambda는 VPC 간 데이터 전송에 대해 요금을 청구합니다. 이는 함수의 VPC가 파일 시스템이 있는 다른 VPC로 피어링된 경우에만 적용됩니다. 요금은 동일한 리전의 VPC 간 Amazon EC2 데이터 전송과 동일합니다. 자세한 내용은 [Lambda 요금](https://aws.amazon.com/lambda/pricing)을 참조하세요.

# Lambda 함수에 대한 별칭 생성
<a name="configuration-aliases"></a>

Lambda 함수의 별칭을 생성할 수 있습니다. Lambda 별칭은 업데이트할 수 있는 함수 버전에 대한 포인터입니다. 함수 사용자는 별칭 Amazon 리소스 이름(ARN)을 사용하여 함수 버전에 액세스할 수 있습니다. 새 버전을 배포할 때 새 버전을 사용하도록 별칭을 업데이트하거나 두 버전 간에 트래픽을 분할하도록 별칭을 업데이트할 수 있습니다.

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

**콘솔을 이용하여 별칭 생성하기**

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

1. 함수를 선택합니다.

1. **별칭(Aliases)**을 선택한 다음 **별칭 생성(Create alias)**을 선택합니다.

1. **별칭 생성(Create alias)** 페이지에서 다음을 수행합니다.

   1. 별칭의 **이름(Name)**을 입력합니다.

   1. (선택 사항) 경보에 대한 **설명(Description)**을 입력합니다.

   1. **버전(Version)**에서 별칭이 가리키도록 할 함수 버전을 선택합니다.

   1. (선택 사항) 별칭에 대한 라우팅을 구성하려면 **가중치 기반 별칭(Weighted alias)**을 확장합니다. 자세한 내용은 [가중치 별칭을 사용하여 Lambda 카나리 배포 구현](configuring-alias-routing.md) 섹션을 참조하세요.

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

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

AWS Command Line Interface(AWS CLI)를 사용하여 별칭을 생성하려면 [create-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-alias.html) 명령을 사용합니다.

```
aws lambda create-alias \
  --function-name my-function \
  --name alias-name \
  --function-version version-number \
  --description " "
```

새 버전의 함수를 가리키도록 별칭을 변경하려면 [update-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-alias.html) 명령을 사용합니다.

```
aws lambda update-alias \
  --function-name my-function \
  --name alias-name \
  --function-version version-number
```

별칭을 삭제하려면 [delete-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-alias.html) 명령을 사용합니다.

```
aws lambda delete-alias \
  --function-name my-function \
  --name alias-name
```

 이전 단계의 AWS CLI 명령은 다음 Lambda API 작업에 해당합니다.
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)
+ [DeleteAlias](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteAlias.html)

------

# 이벤트 소스 및 권한 정책에서 Lambda 별칭 사용
<a name="using-aliases"></a>

각 별칭에는 고유한 ARN이 있습니다. 별칭은 다른 별칭이 아니라 함수 버전만 가리킬 수 있습니다. 함수의 새 버전을 가리키도록 별칭을 업데이트할 수 있습니다.

Amazon Simple Storage Service(Amazon S3)와 같은 이벤트 소스가 Lambda 함수를 호출합니다. 이러한 이벤트 소스에 이벤트가 발생할 때 호출할 함수를 식별하는 매핑이 유지됩니다. 매핑 구성에서 Lambda 함수 별칭을 지정하는 경우 함수 버전이 변경될 때 매핑을 업데이트할 필요가 없습니다. 자세한 내용은 [Lambda가 스트림 및 대기열 기반 이벤트 소스의 레코드를 처리하는 방법](invocation-eventsourcemapping.md) 섹션을 참조하세요.

리소스 정책에서 이벤트 소스에 Lambda 함수를 사용할 수 있는 권한을 부여할 수 있습니다. 정책에서 별칭 ARN을 지정하면 함수 버전이 변경될 때 정책을 업데이트할 필요가 없습니다.

## 리소스 정책
<a name="versioning-permissions-alias"></a>

[리소스 기반 정책](access-control-resource-based.md)을 사용하여 서비스, 리소스 또는 계정에 함수에 대한 액세스 권한을 부여할 수 있습니다. 해당 권한의 범위는 별칭, 버전 또는 전체 함수에 적용하는지 여부에 따라 다릅니다. 예를 들어, 별칭 이름(예: `helloworld:PROD`)을 사용하는 경우, 권한이 있으면 별칭 ARN(`helloworld`)을 사용하여 `helloworld:PROD` 함수를 호출할 수 있습니다.

별칭이나 특정 버전 없이 함수를 호출하려고 하면 권한 오류가 발생합니다. 이 권한 오류는 별칭과 연결된 함수 버전을 직접 호출하려고 해도 계속 발생합니다.

예를 들어, 다음 AWS CLI 명령은 Amazon S3 permissions가 `amzn-s3-demo-bucket`을 대신하여 작동할 때 `helloworld` 함수의 PROD 별칭을 호출할 수 있는 Amazon S3 권한을 부여합니다.

```
aws lambda add-permission \
  --function-name helloworld \
  --qualifier PROD \
  --statement-id 1 \
  --principal s3.amazonaws.com \
  --action lambda:InvokeFunction \
  --source-arn arn:aws:s3:::amzn-s3-demo-bucket \
  --source-account 123456789012
```

정책에서 리소스 이름을 사용하는 방법에 대한 자세한 내용은 [정책의 리소스 및 조건 섹션 미세 조정](lambda-api-permissions-ref.md) 단원을 참조하세요.

# 가중치 별칭을 사용하여 Lambda 카나리 배포 구현
<a name="configuring-alias-routing"></a>

가중치가 적용된 별칭을 사용하여 동일한 함수의 서로 다른 두 [버전](configuration-versions.md) 간에 트래픽을 분할할 수 있습니다. 이 접근 방식을 사용하면 적은 비율의 트래픽으로 함수의 새 버전을 테스트하고 필요한 경우 빠르게 롤백할 수 있습니다. 이를 [카나리 배포](https://docs.aws.amazon.com/whitepapers/latest/overview-deployment-options/canary-deployments.html)라고 합니다. 카나리 배포는 모든 트래픽을 한 번에 전환하는 대신 새 버전을 요청의 일부에만 노출하여 블루/그린 배포와 다릅니다.

별칭이 최대 두 개의 Lambda 함수 버전을 가리키도록 설정할 수 있습니다. 버전은 다음 기준을 충족해야 합니다.
+ 두 버전이 동일한 [실행 역할](lambda-intro-execution-role.md)을 가져야 합니다.
+ 두 버전 모두 동일한 [배달 못한 편지 대기열](invocation-async-retain-records.md#invocation-dlq) 구성을 가져야 하거나 배달 못한 편지 대기열 구성이 없어야 합니다.
+ 두 버전 모두 게시해야 합니다. 별칭은 `$LATEST`을 가리킬 수 없습니다.

**참고**  
Lambda는 간단한 확률 모델을 사용하여 두 함수 버전 간에 트래픽을 분산시킵니다. 트래픽 수준이 낮으면 각 버전에서 구성된 트래픽과 실제 트래픽의 비율 간에 큰 차이가 나타날 수 있습니다. 함수가 프로비저닝된 동시성을 사용하는 경우 별칭 라우팅이 활성 상태인 동안 더 많은 수의 프로비전된 동시성 인스턴스를 구성하여 [초과(spillover) 호출](monitoring-metrics-types.md#invocation-metrics)을 방지할 수 있습니다.

## 가중치가 적용된 별칭 생성
<a name="create-weighted-alias"></a>

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

**콘솔을 사용하여 별칭에 대한 라우팅 구성하기**
**참고**  
함수에 게시된 버전이 두 개 이상 있는지 확인합니다. 추가 버전을 생성하려면 [함수 버전 생성](configuration-versions.md#configuration-versions-config)의 지침을 따르세요.

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

1. 함수를 선택합니다.

1. **별칭(Aliases)**을 선택한 다음 **별칭 생성(Create alias)**을 선택합니다.

1. **별칭 생성(Create alias)** 페이지에서 다음을 수행합니다.

   1. 별칭의 **이름(Name)**을 입력합니다.

   1. (선택 사항) 경보에 대한 **설명(Description)**을 입력합니다.

   1. **버전(Version)**에서 별칭이 가리키도록 할 첫 번째 함수 버전을 선택합니다.

   1. **가중치 기반 별칭(Weighted alias)**을 확장합니다.

   1. **추가 버전(Additional version)**에서 별칭이 가리킬 두 번째 함수 버전을 선택합니다.

   1. **가중치(Weight)(%)**에서 함수의 가중치 값을 입력합니다. *가중치*는 별칭이 간접 호출될 때 해당 버전에 할당되는 트래픽의 비율입니다. 첫 번째 버전에는 남은 가중치가 할당됩니다. 예를 들어 **Additional version(추가 버전)**에 10%를 지정할 경우 첫 번째 버전에 자동으로 90%가 할당됩니다.

   1. **저장**을 선택합니다.

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

[create-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-alias.html) 및 [update-alias](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-alias.html) AWS CLI 명령을 사용하여 두 함수 버전 간의 트래픽 가중치를 구성합니다. 별칭을 만들거나 업데이트할 때 `routing-config` 파라미터에 트래픽 가중치를 지정합니다.

다음 예에서는 함수의 버전 1을 가리키는 **routing-alias**라는 Lambda 함수 별칭을 생성합니다. 함수의 버전 2는 트래픽의 3%를 수신합니다. 나머지 97%의 트래픽은 버전 1로 라우팅됩니다.

```
aws lambda create-alias \
  --name routing-alias \
  --function-name my-function \
  --function-version 1  \
  --routing-config AdditionalVersionWeights={"2"=0.03}
```

이 `update-alias` 명령을 사용하여 버전 2로 들어오는 트래픽의 비율을 늘립니다. 다음 예에서는 트래픽을 5%로 늘립니다.

```
aws lambda update-alias \
  --name routing-alias \
  --function-name my-function \
  --routing-config AdditionalVersionWeights={"2"=0.05}
```

모든 트래픽을 버전 2로 라우팅하려면 `update-alias` 명령을 사용하여 별칭이 버전 2를 가리키도록 `function-version` 속성을 변경합니다. 이 명령은 라우팅 구성도 재설정합니다.

```
aws lambda update-alias \
  --name routing-alias \
  --function-name my-function  \
  --function-version 2 \
  --routing-config AdditionalVersionWeights={}
```

 이전 단계의 AWS CLI 명령은 다음 Lambda API 작업에 해당합니다.
+ [CreateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_CreateAlias.html)
+ [UpdateAlias](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateAlias.html)

------

## 간접 호출된 버전 확인
<a name="determining-routing-version"></a>

두 함수 버전 간에 트래픽 가중치를 구성할 때 간접 호출된 Lambda 함수 버전을 확인하는 방법은 두 가지가 있습니다.
+ **CloudWatch Logs** – 매 함수 간접 호출 시 Lambda가 간접 호출된 버전 ID를 포함한 `START` 로그 항목을 자동으로 내보냅니다. 예제:

  `START RequestId: 1dh194d3759ed-4v8b-a7b4-1e541f60235f Version: 2` 

  별칭 간접 호출을 위해 Lambda는 `ExecutedVersion` 차원을 사용하여 간접 호출된 버전을 기준으로 지표 데이터를 필터링합니다. 자세한 내용은 [Lambda 함수에 대한 지표 보기](monitoring-metrics-view.md) 섹션을 참조하세요.
+ **응답 페이로드(동기식 간접 호출)** – 동기식 함수 간접 호출에 대한 응답에 간접 호출된 함수 버전을 나타내는 `x-amz-executed-version` 헤더가 포함되어 있습니다.

## 가중치가 적용된 별칭을 사용하여 롤링 배포 생성
<a name="lambda-rolling-deployments"></a>

AWS CodeDeploy 및 AWS Serverless Application Model(AWS SAM) 항목을 사용하여 함수 코드의 변경 사항을 자동으로 감지하고, 함수의 새 버전을 배포하고, 새 버전으로 흐르는 트래픽 양을 점진적으로 늘리는 롤링 배포를 생성합니다. 트래픽 양과 증가 속도는 구성이 가능한 파라미터입니다.

롤링 배포에서 AWS SAM는 다음 작업을 수행합니다.
+ Lambda 함수를 구성하고 별칭을 생성합니다. 별칭 가중치 라우팅 구성은 롤링 배포 구현의 기반이 되는 기능입니다.
+ CodeDeploy 애플리케이션 및 배포 그룹을 생성합니다. 배포 그룹은 롤링 배포 및 롤백(필요한 경우)을 관리합니다.
+ 내 Lambda 함수의 새 버전이 생성될 때 이를 감지합니다.
+ 새 버전의 배포를 시작하도록 CodeDeploy를 트리거합니다.

### 예제 AWS SAM 템플릿
<a name="sam-template"></a>

다음 예제는 간단한 롤링 배포를 위한 [AWS SAM 템플릿](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)을 보여줍니다.

```
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A sample SAM template for deploying Lambda functions

Resources:
# Details about the myDateTimeFunction Lambda function
  myDateTimeFunction:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Handler: myDateTimeFunction.handler
      Runtime: nodejs24.x
# Creates an alias named "live" for the function, and automatically publishes when you update the function.
      AutoPublishAlias: live
      DeploymentPreference:
# Specifies the deployment configuration
          Type: Linear10PercentEvery2Minutes
```

이 템플릿은 다음 속성을 가진 `myDateTimeFunction`이라는 Lambda 함수를 정의합니다.

**AutoPublishAlias **  
`AutoPublishAlias` 속성은 `live`라는 별칭을 생성합니다. 또한 AWS SAM 프레임워크는 함수에 대한 새 코드를 저장할 때 이를 자동으로 감지합니다. 그러면 프레임워크가 새 함수 버전을 게시하고 새 버전을 가리키도록 `live` 별칭을 업데이트합니다.

**DeploymentPreference**  
`DeploymentPreference` 속성은 CodeDeploy 애플리케이션이 Lambda 함수의 원래 버전에서 새 버전으로 트래픽을 이동시키는 속도를 결정합니다. 값이 `Linear10PercentEvery2Minutes`면 트래픽의 10%가 2분마다 새 버전으로 새롭게 이동됩니다.  
사전 정의된 배포 구성의 목록은 [배포 구성](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)을 참조하세요.

CodeDeploy 및 AWS SAM 항목을 사용하여 롤링 배포를 생성하는 방법에 대한 자세한 내용은 다음을 참조하세요.
+ [튜토리얼: CodeDeploy와 AWS Serverless Application Model 항목을 사용하여 업데이트된 Lambda 함수 배포](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorial-lambda-sam.html)
+ [AWS SAM에서 서버리스 애플리케이션의 점진적 배포](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html)

# Lambda 함수 버전 관리
<a name="configuration-versions"></a>

버전을 사용하여 함수 배포를 관리할 수 있습니다. 예를 들어, 안정적인 프로덕션 버전 사용에 영향을 주지 않고 베타 테스트를 위한 새 버전의 함수를 게시할 수 있습니다. 함수를 게시할 때마다 Lambda는 함수의 새 버전을 생성합니다. 새 버전은 함수의 게시 되지 않은 버전입니다. 게시되지 않은 버전의 이름은 `$LATEST`입니다.

중요한 것은 함수 코드를 배포할 때마다 `$LATEST`에서 현재 코드를 덮어쓴다는 것입니다. `$LATEST`의 현재 반복을 저장하려면 새 함수 버전을 생성합니다. `$LATEST`가 이전에 게시된 버전과 동일한 경우 `$LATEST`에 변경 내용을 배포할 때까지 새 버전을 생성할 수 없습니다. 이러한 변경에는 코드 업데이트 또는 함수 구성 설정 수정이 포함될 수 있습니다.

함수 버전을 게시한 후에는 해당 코드, 런타임, 아키텍처, 메모리, 계층 및 대부분의 기타 구성 설정을 변경할 수 없습니다. 즉, `$LATEST`에서 새 버전을 게시하지 않으면 이러한 설정을 변경할 수 없습니다. 게시된 함수 버전에 대해 다음 항목을 구성할 수 있습니다.
+ [트리거](lambda-services.md#lambda-invocation-trigger)
+ [대상](invocation-async-retain-records.md#create-destination)
+ [프로비저닝된 동시성](provisioned-concurrency.md)
+ [비동기식 호출](invocation-async.md)
+ [데이터베이스 연결 및 프록시](services-rds.md#rds-configuration)

**참고**  
**자동** 모드에서 [런타임 관리 제어](runtimes-update.md#runtime-management-controls)를 사용하는 경우 함수 버전에서 사용하는 런타임 버전이 자동으로 업데이트됩니다. **함수 업데이트** 또는 **수동** 모드를 사용하는 경우 런타임 버전이 업데이트되지 않습니다. 자세한 내용은 [Lambda가 런타임 버전 업데이트를 관리하는 방법 이해](runtimes-update.md) 섹션을 참조하세요.

**Topics**
+ [함수 버전 생성](#configuration-versions-config)
+ [버전 사용](#versioning-versions-using)
+ [권한 부여](#versioning-permissions)

## 함수 버전 생성
<a name="configuration-versions-config"></a>

함수의 게시 되지 않은 버전에서만 함수 코드와 설정을 변경할 수 있습니다. 버전을 게시하면 Lambda는 해당 버전의 사용자에게 일관된 경험을 유지하기 위해 코드와 대부분의 설정을 잠급니다.

Lambda 콘솔을 사용하여 함수 버전을 생성할 수 있습니다.

**새 함수 버전을 생성하려면**

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

1. 함수를 선택하고 **버전**을 선택하세요.

1. 버전 구성 페이지에서 **새 버전 발행(Publish new version)**을 선택합니다.

1. (선택 사항) 버전 설명을 입력합니다.

1. [**Publish**]를 선택합니다.

또는 [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html) API 작업을 사용하여 함수의 버전을 게시할 수 있습니다.

다음 AWS CLI 명령은 함수의 새 버전을 게시합니다. 응답으로 버전 번호, 버전 접미사가 포함된 함수 ARN과 같은 새 버전에 대한 구성 정보가 반환됩니다.

```
aws lambda publish-version --function-name my-function
```

다음 결과가 표시됩니다.

```
{
  "FunctionName": "my-function",
  "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:1",
  "Version": "1",
  "Role": "arn:aws:iam::123456789012:role/lambda-role",
  "Handler": "function.handler",
  "Runtime": "nodejs24.x",
  ...
}
```

**참고**  
Lambda는 버전 관리를 위해 단조 증가하는 시퀀스 번호를 할당합니다. Lambda는 함수를 삭제하고 다시 생성한 후에도 버전 번호를 재사용하지 않습니다.

## 버전 사용
<a name="versioning-versions-using"></a>

정규화된 ARN 또는 정규화되지 않은 ARN을 사용하여 Lambda 함수를 참조할 수 있습니다.
+ **정규화된 ARN** – 버전 접미사가 포함된 함수 ARN입니다. 다음 예에서는 `helloworld` 함수의 버전 42를 참조합니다.

  ```
  arn:aws:lambda:aws-region:acct-id:function:helloworld:42
  ```
+ **정규화되지 않은 ARN** – 버전 접미사가 포함되지 않은 함수 ARN입니다.

  ```
  arn:aws:lambda:aws-region:acct-id:function:helloworld
  ```

모든 관련 API 작업에서 정규화된 ARN 또는 정규화되지 않은 ARN을 사용할 수 있습니다. 그러나 정규화되지 않은 ARN을 사용하여 별칭을 생성할 수는 없습니다.

함수 버전을 게시하지 않기로 결정한 경우, [이벤트 소스 매핑](invocation-eventsourcemapping.md)에서 정규화된 ARN 또는 정규화되지 않은 ARN을 사용하여 함수를 간접 호출할 수 있습니다. 정규화되지 않은 ARN을 사용하여 함수를 간접 호출하면 Lambda가 `$LATEST`를 묵시적으로 간접 호출합니다.

각 Lambda 함수 버전에 대한 정규화된 ARN은 고유합니다. 버전을 게시한 후에는 ARN 또는 함수 코드를 변경할 수 없습니다.

Lambda는 코드가 게시된 적이 없거나 마지막으로 게시된 버전과 비교하여 코드가 변경된 경우에만 새 함수 버전을 게시합니다. 변경 사항이 없으면 함수 버전은 마지막으로 게시된 버전으로 유지됩니다.

버전을 게시하면 Lambda는 함수 코드 및 구성의 변경 불가능한 스냅샷을 생성합니다. 일부 구성 변경으로는 새 버전의 게시가 트리거되지 않습니다. 다음 구성 변경은 버전 게시를 위해 함수를 검증합니다.
+ 함수 코드
+ 환경 변수
+ 런타임
+ 핸들러
+ 계층
+ 메모리 크기
+ 제한 시간
+ VPC 구성
+ DLQ(Dead Letter Queue) 구성
+ IAM 역할
+ 설명
+ 아키텍처(x86\$164 또는 arm64)
+ 임시 스토리지 크기
+ 패키지 유형
+ 로깅 구성
+ 파일 시스템 구성
+ SnapStart
+ 추적 구성

[예약된 동시성](configuration-concurrency.md)과 같은 운영 설정은 변경 시 새 버전의 게시를 트리거하지 않습니다.

## 권한 부여
<a name="versioning-permissions"></a>

[리소스 기반 정책](access-control-resource-based.md) 또는 [자격 증명 기반 정책](access-control-identity-based.md)을 사용하여 함수에 대한 액세스 권한을 부여할 수 있습니다. 권한의 범위는 정책을 함수에 적용하는지 또는 함수의 한 버전에 적용하는지에 따라 다릅니다. 정책의 함수 리소스 이름에 대한 자세한 내용은 [정책의 리소스 및 조건 섹션 미세 조정](lambda-api-permissions-ref.md) 단원을 참조하세요.

함수 별칭을 사용하여 이벤트 소스 및 AWS Identity and Access Management(IAM) 정책의 관리를 간소화할 수 있습니다. 자세한 내용은 [Lambda 함수에 대한 별칭 생성](configuration-aliases.md) 섹션을 참조하세요.

# Lambda 함수에서 태그 사용
<a name="configuration-tags"></a>

함수에 태그를 지정하여 리소스를 정리하고 관리할 수 있습니다. 태그는 AWS 서비스 전반에서 지원되는 리소스와 연결된 자유 형식의 키-값 페어입니다. 태그 사용 사례에 대한 자세한 내용은 *AWS 리소스에 태그 지정 및 Tag Editor 사용 설명서*의 [일반적인 태그 지정 전략](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies)을 참조하세요.

태그는 버전이나 별칭이 아닌 함수 수준에서 적용됩니다. 태그는 버전을 게시할 때 AWS Lambda 스냅샷이 생성되는 버전별 구성에 포함되지 않습니다. Lambda API를 사용하여 태그를 보고 업데이트할 수 있습니다. Lambda 콘솔에서 특정 함수를 관리하면서 태그를 보고 업데이트할 수도 있습니다.

**Topics**
+ [태그 작업에 필요한 권한](#fxn-tags-required-permissions)
+ [Lambda 콘솔에서 태그 사용](#using-tags-with-the-console)
+ [AWS CLI에서 태그 사용](#configuration-tags-cli)

## 태그 작업에 필요한 권한
<a name="fxn-tags-required-permissions"></a>

AWS Identity and Access Management(IAM) ID(사용자, 그룹 또는 역할)가 리소스의 태그를 읽거나 설정할 수 있도록 허용하려면 해당 권한을 부여합니다.
+ **lambda:ListTags** - 리소스에 태그가 있는 경우 리소스에서 `ListTags`를 직접적으로 호출해야 하는 모든 사람에게 이 권한을 부여합니다. 태그가 지정된 함수의 경우 `GetFunction`에도 이 권한이 필요합니다.
+ **lambda:TagResource** - `TagResource`를 직접적으로 호출하거나 생성 시 태그를 수행해야 하는 모든 사람에게 이 권한을 부여합니다.

선택적으로 리소스에 대한 `UntagResource` 직접 호출을 허용하도록 **lambda:UntagResource** 권한 부여를 고려하세요.

자세한 내용은 [Lambda에 대한 자격 증명 기반 IAM 정책](access-control-identity-based.md) 섹션을 참조하세요.

## Lambda 콘솔에서 태그 사용
<a name="using-tags-with-the-console"></a>

Lambda 콘솔을 사용하여 태그가 있는 함수를 생성하고 기존 함수에 태그를 추가하고 추가한 태그를 기준으로 함수를 필터링할 수 있습니다.

**함수를 생성할 때 태그를 추가하려면**

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

1. **함수 생성**을 선택합니다.

1. **새로 작성(Author from scratch)** 또는 **컨테이너 이미지(Container image)**를 선택합니다.

1. **기본 정보**에서 함수를 설정합니다. 함수 구성에 대한 자세한 내용은 [AWS Lambda 함수 구성](lambda-functions.md) 섹션을 참조하세요.

1. **고급 설정(Advanced settings)**을 확장한 다음 **태그 활성화(Enable tags)**를 선택합니다.

1. 이렇게 하려면 **태그 추가(Add new tag)**를 선택한 다음 **키(Key)** 및 선택 사항인 **값(Value)**을 입력합니다. 태그를 더 추가하려면 이 단계를 반복합니다.

1. **함수 생성**을 선택합니다.

**기존 함수에 태그를 추가하려면**

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

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

1. **구성(Configuration)**을 선택한 다음 **태그(Tags)**를 선택합니다.

1. **태그**에서 **태그 관리**를 선택합니다.

1. 이렇게 하려면 **태그 추가(Add new tag)**를 선택한 다음 **키(Key)** 및 선택 사항인 **값(Value)**을 입력합니다. 태그를 더 추가하려면 이 단계를 반복합니다.

1. **저장**을 선택합니다.

**태그를 사용하여 함수를 필터링하려면**

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

1. 검색 상자를 선택하여 함수 속성과 태그 키 목록을 표시합니다.

1. 태그 키를 선택하여 현재 AWS 리전에서 사용 중인 값 목록을 표시합니다.

1. **용도: “tag-name”**을 선택하여 이 키로 태그가 지정된 모든 함수를 보거나 **연산자**를 선택하여 값으로 추가 필터링할 수 있습니다.

1. 태그 키와 값의 조합으로 필터링하려면 태그 값을 선택합니다.

검색 창은 태그 키 검색도 지원합니다. `tag`을(를) 입력하여 태그 키 목록만 표시하거나 키 이름을 입력하여 목록에서 찾습니다.

## AWS CLI에서 태그 사용
<a name="configuration-tags-cli"></a>

함수를 포함하여 기존 Lambda 리소스에 Lambda API로 태그를 추가하고 제거할 수 있습니다. 또한 함수를 생성할 때 태그를 추가하여 리소스의 전체 수명 주기 동안 태그를 유지할 수 있습니다.

### Lambda 태그 API를 사용하여 태그 업데이트
<a name="tags-fxn-api-config"></a>

[TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) 및 [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html) API 작업을 통해 지원되는 Lambda 리소스에 대한 태그를 추가하고 제거할 수 있습니다.

AWS CLI를 사용하여 이러한 작업을 직접적으로 호출할 수 있습니다. 기존 리소스에 태그를 추가하려면 `tag-resource` 명령을 사용합니다. 이 예에서는 두 개의 태그를 추가합니다. 하나는 *Department*라는 키를 갖는 태그이고 다른 하나는 *CostCenter*라는 키를 갖는 태그입니다.

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

태그를 제거하려면 `untag-resource` 명령을 사용합니다. 이 예에서는 *Department*라는 키가 있는 태그를 제거합니다.

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### 함수를 생성할 때 태그 추가
<a name="creating-tags-when-you-create-a-function-cli"></a>

태그를 사용하여 새로운 Lambda 함수를 생성하려면 [CreateFunction](https://docs.aws.amazon.com//lambda/latest/api/API_CreateFunction.html) API 작업을 사용합니다. `Tags` 파라미터를 지정합니다. `create-function` CLI 명령과 --tags 옵션을 사용하여 이 작업을 직접적으로 호출할 수 있습니다. `CreateFunction`과 함께 태그 파라미터를 사용하기 전에 역할에 이 작업에 필요한 일반적인 권한과 함께 리소스에 태그를 지정할 수 있는 권한이 있는지 확인하세요. 태그 지정 권한에 대한 자세한 내용은 [태그 작업에 필요한 권한](#fxn-tags-required-permissions) 섹션을 참조하세요. 이 예에서는 두 개의 태그를 추가합니다. 하나는 *Department*라는 키를 갖는 태그이고 다른 하나는 *CostCenter*라는 키를 갖는 태그입니다.

```
aws lambda create-function --function-name my-function
--handler index.js --runtime nodejs24.x \
--role arn:aws:iam::123456789012:role/lambda-role \
--tags Department=Marketing,CostCenter=1234ABCD
```

### 함수의 태그 보기
<a name="viewing-tags-on-a-function-cli"></a>

특정 Lambda 리소스에 적용된 태그를 보려면 `ListTags` API 작업을 사용합니다. 자세한 내용은 [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html)를 참조하세요.

Amazon 리소스 이름(ARN)을 제공하여 `list-tags` AWS CLI 명령으로 이 작업을 직접적으로 호출할 수 있습니다.

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

[GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) API 작업을 통해 특정 리소스에 적용된 태그를 볼 수 있습니다. 다른 리소스 유형에는 이와 유사한 기능을 사용할 수 없습니다.

`get-function` CLI 명령으로 이 작업을 직접적으로 호출합니다.

```
aws lambda get-function --function-name my-function
```

### 태그로 리소스 필터링
<a name="tags-fxn-filtering"></a>

AWS Resource Groups Tagging API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) API 작업을 사용하여 태그를 기준으로 리소스를 필터링할 수 있습니다. `GetResources` 작업은 최대 10개의 필터를 수신하며 각 필터는 태그 키와 최대 10개의 태그 값을 포함합니다. `GetResources`에 `ResourceType`을 지정하면 특정 리소스 유형별로 필터링할 수 있습니다.

`get-resources` AWS CLI 명령을 사용하여 이 작업을 직접적으로 호출할 수 있습니다. `get-resources` 사용 예는 *AWS CLI Command Reference*의 [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples)를 참조하세요.

# Lambda 함수에 대한 응답 스트리밍
<a name="configuration-response-streaming"></a>

Lambda 함수는 기본적으로 [Lambda 함수 URL](urls-configuration.md)을 통해 또는 [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API를 사용하여(AWS SDK 또는 API 직접 호출을 통해) 응답 페이로드를 클라이언트로 다시 스트리밍할 수 있습니다. Lambda 함수는 [InvokeWithResponseStream](https://docs.aws.amazon.com/lambda/latest/api/API_InvokeWithResponseStream.html) API를 사용하여 함수를 간접 호출하는 [Amazon API Gateway 프록시 통합](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html)을 통해 응답 페이로드를 스트리밍할 수도 있습니다. 응답 스트리밍은 첫 번째 바이트까지 시간(TTFB) 성능을 개선하여 지연 시간에 민감한 애플리케이션에 도움이 될 수 있습니다. 이는 부분 응답을 사용할 수 있게 되면 클라이언트에 다시 전송할 수 있기 때문입니다. 또한 응답 스트리밍 함수는 버퍼링된 응답의 최대 6MB에 비해 최대 200MB의 페이로드를 반환할 수 있습니다. 응답을 스트리밍하므로 함수가 전체 응답을 메모리에 담을 필요가 없습니다. 응답이 매우 큰 경우 함수에 대해 구성해야 하는 메모리 양을 줄일 수 있습니다.

**참고**  
Lambda 응답 스트리밍은 아직 일부 AWS 리전에서 사용할 수 없습니다. Builder Center의 [리전별 AWS 기능](https://builder.aws.com/build/capabilities)에서 리전별 기능 제공 여부를 참조하세요.

Lambda가 응답을 스트리밍하는 속도는 응답 크기에 따라 달라집니다. 함수 응답의 처음 6MB에 대한 스트리밍 속도에는 제한이 없습니다. 6MB보다 큰 응답의 경우 응답의 나머지 부분에 대역폭 한도가 적용됩니다. 스트리밍 대역폭에 대한 자세한 내용은 [응답 스트리밍에 대한 대역폭 한도](#config-rs-bandwidth-cap) 섹션을 참조하세요.

스트리밍 응답에는 비용이 발생하고 간접 호출 클라이언트 연결이 끊어지면 스트리밍 응답이 중단 또는 중지되지 않습니다. 고객에게는 전체 함수 기간에 대한 요금이 청구되므로 고객은 긴 함수 제한 시간을 구성할 때 주의를 기울여야 합니다.

Lambda는 Node.js 관리형 런타임에서 응답 스트리밍을 지원합니다. Python을 포함한 다른 언어의 경우, [사용자 지정 런타임을 사용자 지정 런타임 API 통합과 함께 사용](runtimes-custom.md#runtimes-custom-response-streaming)하여 응답을 스트리밍하거나 [Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter)를 사용할 수 있습니다.

**참고**  
Lambda 콘솔을 통해 함수를 테스트할 때 항상 응답이 버퍼링된 것으로 표시됩니다.

**Topics**
+ [응답 스트리밍에 대한 대역폭 한도](#config-rs-bandwidth-cap)
+ [응답 스트리밍과의 VPC 호환성](#config-rs-vpc-compatibility)
+ [응답 스트리밍 지원 Lambda 함수 작성](config-rs-write-functions.md)
+ [Lambda 함수 URL을 사용하여 응답 스트리밍 지원 함수 호출](config-rs-invoke-furls.md)
+ [자습서: 함수 URL을 사용하여 응답 스트리밍 Lambda 함수 생성](response-streaming-tutorial.md)

## 응답 스트리밍에 대한 대역폭 한도
<a name="config-rs-bandwidth-cap"></a>

함수 응답 페이로드의 처음 6MB에는 대역폭 한도가 없습니다. 이 초기 버스트 이후 Lambda는 최대 2MBps의 속도로 응답을 스트리밍합니다. 함수 응답이 6MB를 초과하지 않는 경우 이 대역폭 한도는 적용되지 않습니다.

**참고**  
대역폭 한도는 함수의 응답 페이로드에만 적용되며 함수의 네트워크 액세스에는 적용되지 않습니다.

제한되지 않은 대역폭의 속도는 함수의 처리 속도를 비롯한 여러 요인에 따라 달라집니다. 일반적으로 함수 응답의 처음 6MB에 대해 2MBps보다 높은 속도를 예상할 수 있습니다. 함수가 AWS 외부의 대상으로 응답을 스트리밍하는 경우 스트리밍 속도는 외부 인터넷 연결 속도에 따라서도 달라집니다.

## 응답 스트리밍과의 VPC 호환성
<a name="config-rs-vpc-compatibility"></a>

VPC 환경에서 Lambda 함수를 사용할 경우 응답 스트리밍에 대한 중요한 고려 사항이 있습니다.
+ Lambda 함수 URL은 VPC 환경 내에서 응답 스트리밍을 지원하지 않습니다.
+ `InvokeWithResponseStream` API를 사용하는 AWS SDK를 통해 Lambda 함수를 간접적으로 호출하여 VPC 내에서 응답 스트리밍을 사용할 수 있습니다. 이렇게 하려면 Lambda에 적합한 VPC 엔드포인트를 설정해야 합니다.
+ VPC 환경의 경우, VPC의 리소스와 Lambda 서비스 간의 통신을 활성화하려면 Lambda에 대한 인터페이스 VPC 엔드포인트를 생성해야 합니다.

VPC에서 응답 스트리밍을 위한 일반적인 아키텍처는 다음과 같습니다.

```
Client in VPC -> Interface VPC endpoint for Lambda -> Lambda function -> Response streaming back through the same path
```

# 응답 스트리밍 지원 Lambda 함수 작성
<a name="config-rs-write-functions"></a>

응답 스트리밍 함수의 핸들러 작성은 일반적인 핸들러 패턴과 다릅니다. 스트리밍 함수를 작성할 때 다음을 수행해야 합니다.
+ `awslambda.streamifyResponse()` 데코레이터로 함수를 래핑합니다. `awslambda` 글로벌 객체는 Lambda의 Node.js 런타임 환경에서 제공됩니다.
+ 모든 데이터 처리가 완료되도록 스트림을 정상적으로 종료합니다.

## 응답을 스트리밍하도록 핸들러 함수 구성
<a name="config-rs-write-functions-handler"></a>

Lambda가 함수의 응답을 스트리밍해야 함을 런타임에 나타내려면 함수를 `streamifyResponse()` 데코레이터로 래핑해야 합니다. 그러면 런타임이 응답 스트리밍에 적합한 로직 경로를 사용하고 함수가 응답을 스트리밍할 수 있습니다.

`streamifyResponse()` 데코레이터는 다음 파라미터를 수락하는 함수를 수락합니다.
+ `event` - HTTP 메서드, 쿼리 파라미터 및 요청 본문과 같은 함수 URL의 호출 이벤트에 대한 정보를 제공합니다.
+ `responseStream` - 쓰기 가능한 스트림을 제공합니다.
+ `context` – 호출, 함수 및 실행 환경에 대한 정보를 메서드 및 속성에 제공합니다.

`responseStream` 객체는 [Node.js `writableStream`](https://nodesource.com/blog/understanding-streams-in-nodejs/)입니다. 이러한 스트림과 마찬가지로 `pipeline()` 메서드를 사용해야 합니다.

**참고**  
`awslambda` 글로벌 객체는 Lambda의 Node.js 런타임에서 자동으로 제공되므로 가져올 필요가 없습니다.

**Example 응답 스트리밍 지원 핸들러**  

```
import { pipeline } from 'node:stream/promises';
import { Readable } from 'node:stream';

export const echo = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  // As an example, convert event to a readable stream.
  const requestStream = Readable.from(Buffer.from(JSON.stringify(event)));

  await pipeline(requestStream, responseStream);
});
```

`responseStream`은 스트림에 쓰기를 위한 `write()` 메서드를 제공하지만 가능하면 [https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback](https://nodejs.org/api/stream.html#streampipelinesource-transforms-destination-callback)을 사용하는 것이 좋습니다. `pipeline()`을 사용하면 쓰기 가능한 스트림이 더 빠른 읽기 가능한 스트림에 의해 압도되지 않도록 합니다.

## 스트리밍 종료
<a name="config-rs-write-functions-end"></a>

핸들러가 반환되기 전에 스트림을 제대로 종료해야 합니다. `pipeline()` 메서드가 이를 자동으로 처리합니다.

다른 사용 사례의 경우 `responseStream.end()` 메서드를 호출하여 스트림을 올바르게 종료하세요. 이 메서드는 스트림에 더 이상 데이터를 쓰지 말아야 한다는 신호를 보냅니다. `pipeline()` 또는 `pipe()`를 사용하여 스트림에 쓰는 경우에는 이 메서드가 필요하지 않습니다.

Node.js 24부터 Lambda는 핸들러가 반환되거나 응답 스트림이 종료된 후 해결되지 않은 promise가 완료되는 것을 더 이상 기다리지 않습니다. 함수가 타이머 또는 가져오기와 같은 추가 비동기식 작업에 의존하는 경우 핸들러에서 `await` 작업을 수행해야 합니다.

**Example pipeline()을 사용하여 스트림을 종료하는 예제**  

```
import { pipeline } from 'node:stream/promises';

export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  await pipeline(requestStream, responseStream);
});
```

**Example pipeline()을 사용하지 않고 스트림을 종료하는 예제**  

```
export const handler = awslambda.streamifyResponse(async (event, responseStream, _context) => {
  responseStream.write("Hello ");
  responseStream.write("world ");
  responseStream.write("from ");
  responseStream.write("Lambda!");
  responseStream.end();
});
```

# Lambda 함수 URL을 사용하여 응답 스트리밍 지원 함수 호출
<a name="config-rs-invoke-furls"></a>

**참고**  
이제 Lambda 함수가 [Amazon API Gateway 프록시 통합](https://docs.aws.amazon.com/apigateway/latest/developerguide/response-transfer-mode-lambda.html)을 통해 응답 페이로드를 스트리밍할 수 있습니다.

함수 URL의 간접 호출 모드를 변경하여 응답 스트리밍 지원 함수를 간접 호출할 수 있습니다. 간접 호출 모드는 Lambda가 함수를 간접 호출하는 데 사용하는 API 작업을 결정합니다. 사용 가능한 간접 호출 모드는 다음과 같습니다.
+ `BUFFERED` - 기본 옵션입니다. Lambda는 `Invoke` API 작업을 사용하여 함수를 간접 호출합니다. 페이로드가 완료되면 호출 결과를 사용할 수 있습니다. 최대 페이로드 크기는 6MB입니다.
+ `RESPONSE_STREAM` - 함수가 페이로드 결과를 사용할 수 있게 되면 스트리밍할 수 있도록 합니다. Lambda는 `InvokeWithResponseStream` API 작업을 사용하여 함수를 간접 호출합니다. 최대 응답 페이로드 크기는 200MB입니다.

`Invoke` API 작업을 직접 간접 호출하여 응답 스트리밍 없이 함수를 간접 호출할 수 있습니다. 그러나 Lambda는 간접 호출 모드를 `BUFFERED`로 변경할 때까지 함수 URL을 통해 들어오는 간접 호출에 대한 모든 응답 페이로드를 스트리밍합니다.

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

**함수 URL의 간접 호출 모드 설정(콘솔)**

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

1. 간접 호출 모드를 설정할 함수의 이름을 선택합니다.

1. **구성(Configuration)** 탭을 선택한 다음, **함수 URL(Function URL)**을 선택합니다.

1. **편집**을 선택하고 **추가 설정**을 선택합니다.

1. **간접 호출 모드**에서 원하는 간접 호출 모드를 선택합니다.

1. **저장‭**‬을 선택합니다.

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

**함수 URL의 간접 호출 모드 설정(AWS CLI)**

```
aws lambda update-function-url-config \
  --function-name my-function \
  --invoke-mode RESPONSE_STREAM
```

------
#### [ CloudFormation ]

**함수 URL의 간접 호출 모드 설정(CloudFormation)**

```
MyFunctionUrl:
  Type: AWS::Lambda::Url
  Properties:
    AuthType: AWS_IAM
    InvokeMode: RESPONSE_STREAM
```

------

함수 URL 구성에 대한 자세한 내용은 [Lambda 함수 URL](urls-configuration.md) 섹션을 참조하세요.

# 자습서: 함수 URL을 사용하여 응답 스트리밍 Lambda 함수 생성
<a name="response-streaming-tutorial"></a>

이 자습서에서는 응답 스트림을 반환하는 함수 URL 엔드포인트를 사용하여 .zip 파일 아카이브로 정의된 Lambda 함수를 생성합니다. 함수 구성에 대한 자세한 내용은 [함수 URL](urls-configuration.md) 섹션을 참조하세요.

## 사전 조건
<a name="response-streaming-prepare"></a>

이 자습서에서는 사용자가 기본 Lambda 작업과 Lambda 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 그렇지 않은 경우 [콘솔로 Lambda 함수 생성](getting-started.md#getting-started-create-function)의 지침에 따라 첫 Lambda 함수를 생성합니다.

다음 단계를 완료하려면 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)가 필요합니다. 명령과 예상 결과는 별도의 블록에 나열됩니다.

```
aws --version
```

다음 결과가 표시됩니다.

```
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
```

긴 명령의 경우 이스케이프 문자(`\`)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다.

**참고**  
Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:`zip`)은 운영 체제의 기본 제공 터미널에서 지원되지 않습니다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 [Linux용 Windows Subsystem을 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)합니다. 이 안내서의 예제 CLI 명령은 Linux 형식을 사용합니다. Windows CLI를 사용하는 경우 인라인 JSON 문서를 포함하는 명령의 형식을 다시 지정해야 합니다.

## 실행 역할 만들기
<a name="response-streaming-create-iam-role"></a>

Lambda 함수에 AWS 리소스에 액세스할 수 있는 권한을 제공하는 [실행 역할](lambda-intro-execution-role.md)을 만듭니다.

**실행 역할을 만들려면**

1. AWS Identity and Access Management(IAM) 콘솔의 [역할 페이지](https://console.aws.amazon.com/iam/home#/roles)를 엽니다.

1. **역할 생성(Create role)**을 선택합니다.

1. 다음 속성을 사용하여 역할을 만듭니다.
   + **신뢰할 수 있는 엔티티 유형** — **AWS서비스**
   + **사용 사례** — **Lambda**
   + **권한** – **AWSLambdaBasicExecutionRole**
   + **역할 이름** – **response-streaming-role**

**AWSLambdaBasicExecutionRole** 정책은 함수가 Amazon CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다. 역할을 생성한 후 Amazon 리소스 이름(ARN)을 기록해 둡니다. 다음 단계에서 이 정보를 사용할 것입니다.

## 응답 스트리밍 함수 생성(AWS CLI)
<a name="response-streaming-tutorial-create-function-cli"></a>

AWS Command Line Interface(AWS CLI)를 사용하여 함수 URL 엔드포인트로 응답 스트리밍 Lambda 함수를 생성합니다.

**응답을 스트리밍할 수 있는 함수 생성**

1. 다음 코드 예제를 `index.js`라는 파일에 복사합니다. 이 함수는 1초로 구분된 세 개의 응답을 스트리밍합니다.

   ```
   exports.handler = awslambda.streamifyResponse(
   	async (event, responseStream, _context) => {
   		// Metadata is a JSON serializable JS object. Its shape is not defined here.
   		const metadata = {
   		statusCode: 200,
   		headers: {
   			"Content-Type": "application/json",
   			"CustomHeader": "outerspace"
   		}
   		};
   	
   		// Assign to the responseStream parameter to prevent accidental reuse of the non-wrapped stream.
   		responseStream = awslambda.HttpResponseStream.from(responseStream, metadata);
   	
   		responseStream.write("Streaming with Helper \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 0 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 1 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.write("Hello 2 \n");
   		await new Promise(r => setTimeout(r, 1000));
   		responseStream.end();
   		await responseStream.finished();
   	}
     );
   ```

1. 배포 패키지를 만듭니다.

   ```
   zip function.zip index.js
   ```

1. `create-function` 명령을 사용해 Lambda 함수를 만듭니다. `--role` 값을 이전 단계의 역할 ARN으로 변경합니다. 이 명령은 함수 제한 시간을 10초로 설정하여 함수가 세 개의 응답을 스트리밍할 수 있도록 합니다.

   ```
   aws lambda create-function \
     --function-name my-streaming-function \
     --runtime nodejs24.x \
     --zip-file fileb://function.zip \
     --handler index.handler \
     --timeout 10 \
     --role arn:aws:iam::123456789012:role/response-streaming-role
   ```

**함수 URL 생성**

1. 함수에 `lambda:InvokeFunctionUrl` 및 `lambda:InvokeFunction` 권한을 부여하는 리소스 기반 정책을 추가합니다. 각 문은 별도의 명령에 추가해야 합니다. `--principal` 값을 AWS 계정 ID로 바꿉니다.

   ```
   aws lambda add-permission \
     --function-name my-streaming-function \
     --action lambda:InvokeFunctionUrl \
     --statement-id UrlPolicyInvokeURL \
     --principal 123456789012 \
     --function-url-auth-type AWS_IAM
   ```

   ```
   aws lambda add-permission \
       --function-name my-streaming-function \
       --action lambda:InvokeFunction \
       --statement-id UrlPolicyInvokeFunction \
       --principal 123456789012
   ```

1. `create-function-url-config` 명령을 사용하여 함수에 대한 URL 엔드포인트를 만듭니다.

   ```
   aws lambda create-function-url-config \
     --function-name my-streaming-function \
     --auth-type AWS_IAM \
     --invoke-mode RESPONSE_STREAM
   ```
**참고**  
`--invoke-mode`에 대한 오류가 발생하는 경우 [최신 버전의 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)로 업그레이드해야 할 수 있습니다.

## 함수 URL 엔드포인트 테스트
<a name="response-streaming-tutorial-test"></a>

함수를 호출하여 통합을 테스트합니다. 브라우저에서 함수의 URL을 열거나 curl을 사용할 수 있습니다.

```
curl --request GET "https://abcdefghijklm7nop7qrs740abcd.lambda-url.us-east-1.on.aws/" --user "AKIAIOSFODNN7EXAMPLE" --aws-sigv4 "aws:amz:us-east-1:lambda" --no-buffer
```

함수 URL은 `IAM_AUTH` 인증 유형을 사용합니다. 즉, [AWS 액세스 키와 비밀 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)를 모두 사용하여 요청에 서명해야 합니다. 이전 명령에서 `AKIAIOSFODNN7EXAMPLE`을 AWS 액세스 키 ID로 바꿉니다. 메시지가 나타나면 AWS 비밀 키를 입력합니다. AWS 비밀 키가 없으면 [임시 AWS 보안 인증을 대신 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html)할 수 있습니다.

다음과 같은 응답이 표시되어야 합니다.

```
Streaming with Helper 
Hello 0 
Hello 1
Hello 2
```

## 리소스 정리
<a name="cleanup"></a>

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

**집행 역할 삭제**

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

1. 생성한 실행 역할을 선택합니다.

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

1. 텍스트 입력 필드에 역할의 이름을 입력하고 **Delete**(삭제)를 선택합니다.

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

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

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

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

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

# Lambda 메타데이터 엔드포인트 사용
<a name="configuration-metadata-endpoint"></a>

동일한 가용 영역 리소스(예: Amazon ElastiCache 및 Amazon RDS 엔드포인트)로 라우팅하여 지연 시간을 최적화하고 가용 영역을 인식하는 복원력 패턴을 구현할 수 있도록 Lambda 메타데이터 엔드포인트에서는 실행 중인 가용 영역(AZ)을 함수가 검색할 수 있습니다.

엔드포인트에서는 실행 환경 내 localhost HTTP API를 통해 간단한 JSON 형식으로 메타데이터를 반환하며 런타임과 확장 프로그램에 모두 액세스할 수 있습니다.

**Topics**
+ [시작하기](#metadata-endpoint-getting-started)
+ [가용 영역 ID 이해하기](#metadata-endpoint-az-ids)
+ [API 참조](#metadata-endpoint-api-reference)

## 시작하기
<a name="metadata-endpoint-getting-started"></a>

[Powertools for AWS Lambda](https://docs.aws.amazon.com/powertools/)에서는 Python, TypeScript, Java 및 .NET의 Lambda 메타데이터 엔드포인트 액세스용 유틸리티를 제공합니다. 유틸리티에서는 첫 번째 직접 호출 후 응답을 캐싱하고 SnapStart 캐시 무효화를 자동으로 처리합니다.

Powertools for AWS Lambda 메타데이터 유틸리티 사용 또는 메타데이터 엔드포인트 직접 호출

------
#### [ Python ]

Powertools 패키지 설치:

```
pip install "aws-lambda-powertools"
```

핸들러에서 메타데이터 유틸리티 사용:

**Example Powertools로 AZ ID 검색하기(Python)**  

```
from aws_lambda_powertools.utilities.lambda_metadata import get_lambda_metadata

def handler(event, context):
    metadata = get_lambda_metadata()
    az_id = metadata.availability_zone_id  # e.g., "use1-az1"

    return {"az_id": az_id}
```

------
#### [ TypeScript ]

Powertools 패키지 설치:

```
npm install @aws-lambda-powertools/commons
```

핸들러에서 메타데이터 유틸리티 사용:

**Example Powertools로 AZ ID 검색하기(TypeScript)**  

```
import { getMetadata } from '@aws-lambda-powertools/commons/utils/metadata';

const metadata = await getMetadata();

export const handler = async () => {
  const { AvailabilityZoneID: azId } = metadata;
  return azId;
};
```

------
#### [ Java ]

`pom.xml`에 Powertools 종속성 추가:

```
<dependencies>
    <dependency>
        <groupId>software.amazon.lambda</groupId>
        <artifactId>powertools-lambda-metadata</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>
```

핸들러에서 메타데이터 클라이언트 사용:

**Example Powertools로 AZ ID 검색하기(Java)**  

```
import software.amazon.lambda.powertools.metadata.LambdaMetadata;
import software.amazon.lambda.powertools.metadata.LambdaMetadataClient;

public class App implements RequestHandler<Object, String> {

    @Override
    public String handleRequest(Object input, Context context) {
        LambdaMetadata metadata = LambdaMetadataClient.get();
        String azId = metadata.getAvailabilityZoneId(); // e.g., "use1-az1"

        return "{\"azId\": \"" + azId + "\"}";
    }
}
```

------
#### [ .NET ]

Powertools 패키지 설치:

```
dotnet add package AWS.Lambda.Powertools.Metadata
```

핸들러에서 메타데이터 클래스 사용:

**Example Powertools로 AZ ID 검색하기(.NET)**  

```
using AWS.Lambda.Powertools.Metadata;

public class Function
{
    public string Handler(object input, ILambdaContext context)
    {
        var azId = LambdaMetadata.AvailabilityZoneId;
        return $"Running in AZ: {azId}";
    }
}
```

------
#### [ All Runtimes ]

모든 런타임에서는 메타데이터 엔드포인트를 지원합니다(사용자 지정 런타임 및 컨테이너 이미지 포함). 다음 예제를 사용하여 Lambda가 실행 환경에서 자동으로 설정하는 환경 변수를 사용하는 함수에서 메타데이터 API에 직접 액세스합니다.

**Example 메타데이터 엔드포인트에 직접 액세스하기**  

```
# Variables are automatically set by Lambda
METADATA_ENDPOINT="http://${AWS_LAMBDA_METADATA_API}/2026-01-15/metadata/execution-environment"

# Make the request
RESPONSE=$(curl -s -H "Authorization: Bearer ${AWS_LAMBDA_METADATA_TOKEN}" "$METADATA_ENDPOINT")

# Parse the AZ ID
AZ_ID=$(echo "$RESPONSE" | jq -r '.AvailabilityZoneID')

echo "Function is running in AZ ID: $AZ_ID"
```

------

## 가용 영역 ID 이해하기
<a name="metadata-endpoint-az-ids"></a>

AZ ID(예: `use1-az1`)에서는 항상 모든 AWS 계정의 동일한 물리적 위치를 참조하는 반면에 AZ 이름(예: `us-east-1a`)은 특정 리전의 각 AWS 계정의 상이한 물리적 인프라에 매핑될 수 있습니다. 자세한 내용은 [크로스 계정 일관성을 위한 AZ ID](https://docs.aws.amazon.com/global-infrastructure/latest/regions/az-ids.html)를 참조하세요.

**AZ 이름으로 AZ ID 변환하기:**

AZ ID를 AZ 이름으로 변환하려면 EC2 [DescribeAvailabilityZones](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeAvailabilityZones.html) API를 사용합니다. 이 API를 사용하려면 함수의 실행 역할에 `ec2:DescribeAvailabilityZones` 권한을 추가합니다.

## API 참조
<a name="metadata-endpoint-api-reference"></a>

### 환경 변수
<a name="metadata-endpoint-env-vars"></a>

Lambda에서는 모든 실행 환경에서 다음과 같은 환경 변수를 자동으로 설정합니다.
+ `AWS_LAMBDA_METADATA_API` - `{ipv4_address}:{port}` 형식의 메타데이터 서버 주소입니다(예: `169.254.100.1:9001`).
+ `AWS_LAMBDA_METADATA_TOKEN` - 현재 실행 환경의 고유 인증 토큰입니다. Lambda에서는 초기화 시 이 토큰을 자동으로 생성합니다. 모든 메타데이터 API 요청에 포함합니다.

### 엔드포인트
<a name="metadata-endpoint-url"></a>

`GET http://${AWS_LAMBDA_METADATA_API}/2026-01-15/metadata/execution-environment`

### 요청
<a name="metadata-endpoint-request"></a>

**필수 헤더:**
+ `Authorization` - 전달자 체계(`Bearer <token>`)가 있는 `AWS_LAMBDA_METADATA_TOKEN` 환경 변수의 토큰 값입니다. 이 토큰 기반 인증에서는 SSRF(서버 측 요청 위조) 취약성에 대한 심층 방어 보호를 제공합니다. 각 실행 환경에서는 초기화 시 무작위로 생성된 고유한 토큰을 수신합니다.

### 응답
<a name="metadata-endpoint-response"></a>

**Status:** `200 OK`

**Content-Type:** `application/json`

**Cache-Control:** `private, max-age=43200, immutable`

응답은 실행 환경 내에서 변경할 수 없습니다. 클라이언트에서는 응답을 캐싱하고 `Cache-Control` TTL을 준수해야 합니다. SnapStart 함수의 경우 실행 환경이 다른 AZ에 있을 수 있을 때 복원 후 클라이언트에서 메타데이터를 새로 고치도록 초기화 동안 TTL이 감소합니다. Powertools를 사용하는 경우 캐싱 및 SnapStart 무효화가 자동으로 처리됩니다.

**본문:**

```
{
  "AvailabilityZoneID": "use1-az1"
}
```

`AvailabilityZoneID` 필드에는 실행 환경이 실행 중인 가용 영역의 고유 식별자가 있습니다.

**참고**  
향후 업데이트에서 응답에 추가 필드를 추가할 수 있습니다. 클라이언트는 알 수 없는 필드를 무시하고 새 필드가 나타나면 실패하지 않아야 합니다.

### 오류 응답
<a name="metadata-endpoint-errors"></a>
+ **401 Unauthorized** - `Authorization` 헤더가 누락되었거나 유효하지 않은 토큰이 있습니다. `Bearer ${AWS_LAMBDA_METADATA_TOKEN}`을 전달 중인지 확인합니다.
+ **405 Method Not Allowed** - 요청 메서드가 `GET`이 아닙니다.
+ **500 Internal Server Error** - 서버 측 처리 오류입니다.