

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

# AWS SAM 템플릿 생성
<a name="tutorial-lambda-sam-template"></a>

인프라의 구성 요소를 지정하는 AWS SAM 템플릿 파일을 생성합니다.

**AWS SAM 템플릿을 생성하려면**

1.  `SAM-Tutorial`이라는 디렉터리를 생성합니다.

1.  `SAM-Tutorial` 디렉터리에서 `template.yml`이라는 파일을 생성합니다.

1.  다음 YAML 코드를 `template.yml`에 복사합니다. 이 파일은 AWS SAM 템플릿입니다.

   ```
   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
       Properties:
         Handler: myDateTimeFunction.handler
         Runtime: nodejs18.x
   # Instructs your myDateTimeFunction is published to an alias named "live".      
         AutoPublishAlias: live
   # Grants this function permission to call lambda:InvokeFunction
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: '*'
         DeploymentPreference:
   # Specifies the deployment configuration      
             Type: Linear10PercentEvery1Minute
   # Specifies Lambda functions for deployment lifecycle hooks
             Hooks:
               PreTraffic: !Ref beforeAllowTraffic
               PostTraffic: !Ref afterAllowTraffic
               
   # Specifies the BeforeAllowTraffic lifecycle hook Lambda function
     beforeAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: beforeAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call lambda:InvokeFunction        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_beforeAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
             
   # Specifies the AfterAllowTraffic lifecycle hook Lambda function
     afterAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: afterAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus         
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call lambda:InvokeFunction          
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_afterAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
   ```

이 템플릿은 다음을 지정합니다. 자세한 내용은 [AWS SAM 템플릿 개념](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)을 참조하세요.

**Lambda 함수 `myDateTimeFunction`**  
 이 Lambda 함수가 게시되면 템플릿의 `AutoPublishAlias`줄은 이 함수를 `live` (이)라는 별칭에 연결합니다. 이 자습서의 뒷부분에서이 함수를 업데이트 AWS CodeDeploy 하면 프로덕션 트래픽을 원래 버전에서 업데이트된 버전으로 점진적으로 이동하는 배포가 트리거됩니다.

**두 개의 Lambda 배포 확인 함수**  
 다음 Lambda 함수는 CodeDeploy 수명 주기 후크 중에 실행됩니다. 이 함수에는 업데이트된 `myDateTimeFunction`의 배포를 확인하는 코드가 포함되어 있습니다. 확인 테스트의 결과는 `PutLifecycleEventHookExecutionStatus` API 메서드를 사용하여 CodeDeploy에 전달됩니다. 확인 테스트가 실패하면 배포가 실패하고 롤백됩니다.  
+  `CodeDeployHook_beforeAllowTraffic`은 `BeforeAllowTraffic` 후크 중에 실행됩니다.
+  `CodeDeployHook_afterAllowTraffic`은 `AfterAllowTraffic` 후크 중에 실행됩니다.
두 함수의 이름은 모두 `CodeDeployHook_`로 시작합니다. `CodeDeployRoleForLambda` 역할은 이름이 이 접두사로 시작하는 Lambda 함수의 Lambda `invoke` 메서드에 대한 호출만 허용합니다. 자세한 내용은 [AWS Lambda 배포를 위한 AppSpec 'hooks' 섹션](reference-appspec-file-structure-hooks.md#appspec-hooks-lambda)와(과) *CodeDeploy API 참조*의 [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)를 참조하세요.

**업데이트된 Lambda 함수의 자동 감지**  
 `AutoPublishAlias` 기간은 `myDateTimeFunction` 함수가 언제 변경되는지를 감지한 다음 `live` 별칭을 사용하여 함수를 배포합니다.

**배포 구성**  
 배포 구성에 따라 CodeDeploy 애플리케이션이 Lambda 함수의 원래 버전에서 새 버전으로 트래픽을 이동하는 속도가 결정됩니다. 이 템플릿은 미리 정의된 배포 구성인 `Linear10PercentEvery1Minute`를 지정합니다.  
 AWS SAM 템플릿에서는 사용자 지정 배포 구성을 지정할 수 없습니다. 자세한 내용은 [CodeDeploy에서 배포 구성 만들기](deployment-configurations-create.md) 단원을 참조하십시오.

**배포 수명 주기 후크 함수**  
 `Hooks` 섹션은 수명 주기 이벤트 후크 중에 실행할 함수를 지정합니다. `PreTraffic`은 `BeforeAllowTraffic` 후크 중에 실행되는 함수를 지정합니다. `PostTraffic`는 `AfterAllowTraffic` 후크 중에 실행되는 함수를 지정합니다.

**또 다른 Lambda 함수를 호출할 Lambda의 권한**  
 지정된 `lambda:InvokeFunction` 권한은 AWS SAM 애플리케이션에서 사용하는 역할에 Lambda 함수를 호출할 수 있는 권한을 부여합니다. 이 권한은 확인 테스트 중에 `CodeDeployHook_beforeAllowTraffic` 및 `CodeDeployHook_afterAllowTraffic` 함수가 배포된 Lambda 함수를 호출할 때 필요합니다.