

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 template concepts (テンプレートの概念)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html) を参照してください。

**`myDateTimeFunction` と呼ばれるLambda 関数**  
 この Lambda 関数が発行されると、テンプレート中の `AutoPublishAlias` の行は、それを `live` という名前のエイリアスにリンクします。このチュートリアルの後半で、この関数の更新により、本番トラフィックを元のバージョンから更新されたバージョンに段階的に移行 AWS CodeDeploy する によるデプロイがトリガーされます。

**2 つの 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 Reference* 中の [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` は、`PostTraffic` フック中に実行する関数を指定します。`BeforeAllowTraffic` は、フック中に `AfterAllowTraffic` が実行する関数を指定します。

**Lambda が別の Lambda 関数を呼び出すための許可**  
 指定された`lambda:InvokeFunction`アクセス許可は、SAM AWS アプリケーションで使用されるロールに Lambda 関数を呼び出すアクセス許可を付与します。これは、`CodeDeployHook_beforeAllowTraffic` および `CodeDeployHook_afterAllowTraffic` の関数が、検証テスト中に、デプロイされた Lambda 関数を呼び出す場合に必要です。