

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

# チュートリアル: Lambda 呼び出しアクションで変数を使用する
<a name="tutorials-lambda-variables"></a>

Lambda 呼び出しアクションは、入力のパートとして別のアクションの変数を使用し、出力とともに新しい変数を返すことができます。CodePipeline のアクションの変数については、「[変数リファレンス](reference-variables.md)」を参照してください。

**重要**  
パイプライン作成の一環として、CodePipeline は、ユーザーが指定した S3 アーティファクトバケットをアーティファクトとして使用します (これは S3 ソースアクションで使用するバケットとは異なります)。S3 アーティファクトバケットがパイプラインのアカウントとは異なるアカウントにある場合は、S3 アーティファクトバケットが によって所有 AWS アカウント されており、安全で信頼できることを確認してください。

このチュートリアルを終了すると、以下の項目が使用可能になります。
+ Lambda は次のアクションを呼び出します。
  + CodeCommit ソースアクションからの `CommitId` 変数を使用する
  + 3 つの新しい変数として `dateTime`、`testRunId`、`region` を出力する
+ Lambda 呼び出しアクションからの新しい変数を使用してテスト URL とテスト実行 ID を提供する手動承認アクション
+ 新しいアクションを反映して更新されたパイプライン

**Topics**
+ [前提条件](#lambda-variables-prereqs)
+ [ステップ 1: Lambda 関数を作成する](#lambda-variables-function)
+ [ステップ 2: Lambda 呼び出しアクションと手動承認アクションをパイプラインに追加する](#lambda-variables-pipeline)

## 前提条件
<a name="lambda-variables-prereqs"></a>

始めるには以下のものが必要です。
+ [チュートリアル: シンプルなパイプラインを作成する (CodeCommit リポジトリ)](tutorials-simple-codecommit.md) の CodeCommit ソースを使用してパイプラインを作成または使用できます。
+ 既存のパイプラインを編集して CodeCommit ソースアクションに名前空間を含めます。名前空間 `SourceVariables` をアクションに割り当てます。

## ステップ 1: Lambda 関数を作成する
<a name="lambda-variables-function"></a>

次のステップを使用して Lambda 関数と Lambda 実行ロールを作成します。Lambda 関数を作成した後、パイプラインに Lambda アクションを追加します。

**Lambda 関数と実行ロールを作成するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) で AWS Lambda コンソールを開きます。

1. [**関数の作成**] を選択してください。[**一から作成**] が選択された状態のままにしておきます。

1. [**関数名**] に、関数の名前 (**myInvokeFunction** など) を入力します。[**ランタイム**] は、デフォルトのオプションを選択したままにします。

1. [**実行ロールの選択または作成**] を選択します。[**基本的な Lambda アクセス権限で新しいロールを作成**] を選択します。

1. [**関数の作成**] を選択してください。

1. 別のアクションからの変数を使用するには、Lambda 呼び出しアクションの設定で `UserParameters` にその変数を渡す必要があります。このチュートリアルで後ほどパイプラインのアクションを設定しますが、ここでは変数を渡したものとしてコードを追加します。

   新しい変数を生成するには、入力の `outputVariables` というプロパティを `putJobSuccessResult` に設定します。`putJobFailureResult` の一部として変数を生成することはできない点に注意してください。

   ```
    const putJobSuccess = async (message) => {
           const params = {
               jobId: jobId,
               outputVariables: {
                   testRunId: Math.floor(Math.random() * 1000).toString(),
                   dateTime: Date(Date.now()).toString(),
                   region: lambdaRegion
               }
           };
   ```

   新しい関数の **[コード]** タブで、次のサンプルコードを `index.mjs` の下に貼り付けます。

   ```
   import { CodePipeline } from '@aws-sdk/client-codepipeline';
   
   export const handler = async (event, context) => {
       const codepipeline = new CodePipeline({});
       
       // Retrieve the Job ID from the Lambda action
       const jobId = event["CodePipeline.job"].id;
       
       // Retrieve UserParameters
       const params = event["CodePipeline.job"].data.actionConfiguration.configuration.UserParameters;
       
       // The region from where the lambda function is being executed
       const lambdaRegion = process.env.AWS_REGION;
       
       // Notify CodePipeline of a successful job
       const putJobSuccess = async (message) => {
           const params = {
               jobId: jobId,
               outputVariables: {
                   testRunId: Math.floor(Math.random() * 1000).toString(),
                   dateTime: Date(Date.now()).toString(),
                   region: lambdaRegion
               }
           };
           
           try {
               await codepipeline.putJobSuccessResult(params);
               return message;
           } catch (err) {
               throw err;
           }
       };
       
       // Notify CodePipeline of a failed job
       const putJobFailure = async (message) => {
           const params = {
               jobId: jobId,
               failureDetails: {
                   message: JSON.stringify(message),
                   type: 'JobFailed',
                   externalExecutionId: context.invokeid
               }
           };
           
           try {
               await codepipeline.putJobFailureResult(params);
               throw message;
           } catch (err) {
               throw err;
           }
       };
       
       try {
           console.log("Testing commit - " + params);
           
           // Your tests here
           
           // Succeed the job
           return await putJobSuccess("Tests passed.");
       } catch (ex) {
           // If any of the assertions failed then fail the job
           return await putJobFailure(ex);
       }
   };
   ```

1. 自動保存することを関数に許可します。

1. 画面上部の **[関数 ARN]** にある Amazon リソースネーム (ARN) をコピーします。

1. 最後のステップとして、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で AWS Identity and Access Management (IAM) コンソールを開きます。Lambda 実行ロールを変更して、次のポリシーを追加します。[AWSCodePipelineCustomActionAccess](https://console.aws.amazon.com/iam/home?region=us-west-2#/policies/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAWSCodePipelineCustomActionAccess)。Lambda 実行ロールを作成したり、ロールポリシーを変更したりする手順については、「[ステップ 2 : Lambda 関数を作成する](actions-invoke-lambda-function.md#actions-invoke-lambda-function-create-function)」を参照してください。

## ステップ 2: Lambda 呼び出しアクションと手動承認アクションをパイプラインに追加する
<a name="lambda-variables-pipeline"></a>

このステップでは、パイプラインに Lambda 呼び出しアクションを追加します。**Test** という名前のステージの一部としてアクションを追加します。アクションタイプは、呼び出しアクションです。次に、呼び出しアクションの後に、手動承認アクションを追加します。

**パイプラインに Lambda アクションと手動承認アクションを追加するには**

1. CodePipeline コンソール ([https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)) を開きます。

    AWS アカウントに関連付けられているすべてのパイプラインの名前が表示されます。アクションを追加するパイプラインを選択します。

1. パイプラインに Lambda テストアクションを追加します。

   1. パイプラインを編集するには、[**編集**] を選択します。既存のパイプラインで、ソースアクションの後にステージを追加します。ステージの名前 (**Test** など) を入力します。

   1. 新しいステージで、**[アクショングループを追加する]** を選択してアクションを追加します。「**アクション名**」に、呼び出しアクションの名前 (**Test\$1Commit** など) を入力します。

   1. [**アクションプロバイダー**] で、[**AWS Lambda** ] を選択します。

   1. [**入力アーティファクト**] で、ソースアクションの出力アーティファクトの名前 (`SourceArtifact` など) を選択します。

   1. **[関数名]** で、作成した Lambda 関数の ARN を追加します。

   1. [**変数名前空間**] に名前空間名 (**TestVariables** など) を追加します。

   1. **[出力アーティファクト]** で、出力アーティファクト名 (**LambdaArtifact** など) を追加します。

   1. **[Done]** (完了) をクリックします。

1. パイプラインに手動の承認アクションを追加します。

   1. パイプラインが編集モードのままで、呼び出しアクションの後にステージを追加します。ステージの名前 (**Approval** など) を入力します。

   1. 新しいステージで、アクションを追加するアイコンを選択します。[**アクション名**] に、承認アクションの名前 (**Change\$1Approval** など) を入力します。

   1. [**アクションプロバイダ**] で、[**手動承認**] を選択します。

   1. [**レビューする URL**] で、`region` 変数と `CommitId` 変数の変数構文を追加して URL を作成します。出力変数を提供するアクションに割り当てられた名前空間を使用してください。

      この例では、CodeCommit アクションの変数構文を持つ URL にはデフォルトの名前空間 `SourceVariables` があります。Lambda リージョン出力変数には、`TestVariables` 名前空間があります。URL は次のようになります。

      ```
      https://#{TestVariables.region}.console.aws.amazon.com/codesuite/codecommit/repositories/MyDemoRepo/commit/#{SourceVariables.CommitId}
      ```

      [**コメント**] で、`testRunId` 変数の変数構文を追加して、承認メッセージテキストを作成します。この例では、Lambda `testRunId` 出力変数の変数構文を持つ URL には `TestVariables` 名前空間があります。以下のメッセージを入力します。

      ```
      Make sure to review the code before approving this action. Test Run ID: #{TestVariables.testRunId}
      ```

1. [**完了**] を選択してアクションの編集画面を閉じ、[**完了**] を選択してステージの編集画面を閉じます。パイプラインを保存するには、[**完了**] を選択します。完成したパイプラインには、ソース、テスト、承認、デプロイの各ステージがある構造が含まれています。

   [**変更のリリース**] を選択して、パイプライン構造で最新の変更を実行します。

1. パイプラインが手動承認ステージに達したら、[**確認**] を選択します。解決された変数は、コミット ID の URL として表示されます。承認者は、コミットを表示する URL を選択できます。

1. パイプラインが正常に実行されたら、アクションの実行履歴ページで変数の値を表示することもできます。