AWS Lambda
開発者ガイド

AWS CodePipeline を使用して Lambda アプリケーションの継続的な配信パイプラインを構築する

AWS CodePipeline を使用して、Lambda アプリケーションの継続的配信パイプラインを作成することができます。CodePipeline では、ソース管理、ビルド、およびデプロイメントのリソースを組み合わせて、アプリケーションのソースコードを変更するたびに実行されるパイプラインを作成します。

このチュートリアルでは、次のリソースを作成します。

  • リポジトリ – AWS CodeCommit の Git リポジトリ。変更をプッシュすると、パイプラインはソースコードを Amazon S3 バケットにコピーしてから、それをビルドプロジェクトに渡します。

  • ビルドプロジェクト – パイプラインからソースコードを取得してアプリケーションをパッケージ化する、AWS CodeBuild のビルド。このソースには、依存関係をインストールしてデプロイメント用の AWS サーバーレスアプリケーションモデル (AWS SAM) テンプレートを準備するコマンドを含むビルド仕様が含まれます。

  • デプロイ設定 – パイプラインのデプロイメントステージでは、ビルド出力から AWS SAM テンプレートを取得して、AWS CloudFormation に変更セットを作成後、変更セットを実行して、アプリケーションの AWS CloudFormation スタックを更新します。

  • AWS CloudFormation スタック – デプロイステージは、テンプレートを使用して、AWS CloudFormation でスタックを作成します。このテンプレートは、Lambda アプリケーションのリソースを定義する YAML 形式のドキュメントです。アプリケーションには、Lambda 関数とそれを呼び出す Amazon API Gateway API が含まれています。

  • ロール – パイプライン、ビルド、デプロイメントにはそれぞれ、AWS リソースの管理をそれらに許可するサービスロールがあります。これらのリソースを作成すると、コンソールによってパイプラインの作成とロールの構築が行われます。アプリケーションスタックの管理を AWS CloudFormation に許可するロールを作成します。

パイプラインによって、リポジトリの 1 つのブランチが 1 つの AWS CloudFormation スタックにマッピングされます。さらにパイプラインを作成して、他のブランチの環境を同じリポジトリ内に追加することができます。また、試験遂行、ステージング、手動承認用にステージをパイプラインに追加することもできます。AWS CodePipeline の詳細については、「AWS CodePipeline とは」を参照してください。

前提条件

このチュートリアルでは、基本的な Lambda オペレーションと Lambda コンソールについてある程度の知識があることを前提としています。まだ作成していない場合は、AWS Lambda の使用開始 の指示に従って、まず Lambda 関数を作成します。

このガイドの手順に従うには、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要になります。コマンドは、該当する場合、プロンプト記号 ($) と現在のディレクトリの名前が前に付けられて、リストに示されます。

~/lambda-project$ this is a command this is output

コマンドが長い場合は、エスケープ文字 (\) を使用して、コマンドを複数の行に分割します。

Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

ビルドフェーズで、ビルドスクリプトを使用してアーティファクトを Amazon Simple Storage Service (Amazon S3) にアップロードします。既存のバケットを使用するか、パイプライン用に新しいバケットを作成することができます。AWS CLI を使用してバケットを作成します。

$ aws s3 mb s3://lambda-deployment-artifacts-123456789012

AWS CloudFormation ロールを作成する

AWS リソースにアクセスするためのアクセス許可を AWS CloudFormation に付与するロールを作成します。

AWS CloudFormation ロールを作成するには

  1. IAM コンソールの [Roles] ページを開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティAWS CloudFormation

    • アクセス許可AWSLambdaExecute

    • ロール名cfn-lambda-pipeline

  4. このロールを開きます。[アクセス許可] タブで [インラインポリシーの追加] を選択します。

  5. [ポリシーの作成] で、[JSON] タブを選択し、次のポリシーを追加します。

    { "Statement": [ { "Action": [ "apigateway:*", "codedeploy:*", "lambda:*", "cloudformation:CreateChangeSet", "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy", "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy", "iam:PassRole", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" } ], "Version": "2012-10-17" }

リポジトリをセットアップする

プロジェクトファイルを保存するには、AWS CodeCommit リポジトリを作成します。詳細については、『CodeCommit ユーザーガイド』の「セットアップ」を参照してください。

リポジトリを作成するには

  1. 開発者向けツールコンソール」を開きます。

  2. [ソース] で、[リポジトリ] を選択します。

  3. [リポジトリの作成] を選択します。

  4. 指示に従って、lambda-pipeline-repo という名前のリポジトリを作成して、クローンを作成します。

以下のファイルをリポジトリフォルダに作成します。

例 index.js

現在の時刻を返す Lambda 関数。

var time = require('time'); exports.handler = (event, context, callback) => { var currentTime = new time.Date(); currentTime.setTimezone("America/Los_Angeles"); callback(null, { statusCode: '200', body: 'The time in Los Angeles is: ' + currentTime.toString(), }); };

例 template.yaml

アプリケーションを定義する SAM テンプレート

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Outputs the time Resources: TimeFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs10.x CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET

例 buildspec.yml

必要なパッケージをインストールし、デプロイパッケージを Amazon S3 にアップロードする AWS CodeBuild ビルド仕様。ハイライトされたテキストをバケットの名前に置き換えます。

version: 0.2 phases: install: runtime-versions: nodejs: 10 build: commands: - npm install time - export BUCKET=lambda-deployment-artifacts-123456789012 - aws cloudformation package --template-file template.yaml --s3-bucket $BUCKET --output-template-file outputtemplate.yaml artifacts: type: zip files: - template.yaml - outputtemplate.yaml

ファイルをコミットし、CodeCommit にプッシュします。

~/lambda-pipeline-repo$ git add . ~/lambda-pipeline-repo$ git commit -m "project files" ~/lambda-pipeline-repo$ git push

パイプラインの作成

アプリケーションをデプロイするパイプラインを作成します。パイプラインでは、リポジトリに変更がないかモニタリングし、AWS CodeBuild ビルドを実行してデプロイパッケージを作成して、AWS CloudFormation でアプリケーションをデプロイします。パイプラインの作成中に、AWS CodeBuild ビルドプロジェクトも作成します。

パイプラインを作成するには

  1. 開発者向けツールコンソール」を開きます。

  2. [パイプライン] で、[パイプライン] を選択します。

  3. [Create pipeline] を選択します。

  4. パイプライン設定を行い、[次へ] を選択します。

    • パイプライン名lambda-pipeline

    • サービスロール新しいサービスロール

    • アーティファクトストアデフォルトの場所

  5. ソースステージ設定を行い、[次へ] を選択します。

    • ソースプロバイダーAWS CodeCommit

    • リポジトリ名lambda-pipeline-repo

    • ブランチ名master

    • 変更検出オプションAmazon CloudWatch Events

  6. [ビルドプロバイダー] で、[AWS CodeBuild]、[プロジェクトの作成] の順に選択します。

  7. ビルドプロジェクト設定を行い、[CodePipeline に進む] を選択します。

    • プロジェクト名lambda-pipeline-build

    • オペレーティングシステムUbuntu

    • ランタイム標準

    • ランタイムバージョンaws/codebuild/standard:2.0

    • イメージのバージョン最新

    • Buildspec 名buildspec.yml

  8. [次へ] を選択します。

  9. デプロイステージ設定を行い、[次へ] を選択します。

    • デプロイプロバイダーAWS CloudFormation

    • アクションモード変更セットの作成または置換

    • スタック名lambda-pipeline-stack

    • 変更セット名lambda-pipeline-changeset

    • テンプレートBuildArtifact::outputtemplate.yaml

    • 機能CAPABILITY_IAM

    • ロール名cfn-lambda-pipeline

  10. [Create pipeline] を選択します。

追加のアクセス許可が必要なため、パイプラインの初回実行時は失敗します。次のセクションでは、ビルドステージ用に生成されたロールにアクセス許可を追加します。

ビルドステージロールを更新する

ビルドステージ中、ビルド出力を Amazon S3 バケットをアップロードするアクセス許可が AWS CodeBuild に必要です。

ロールを更新するには

  1. IAM コンソールの [Roles] ページを開きます。

  2. [code-build-lamba-pipeline-service-role] を選択します。

  3. [Attach policies (ポリシーをアタッチします)] を選択します。

  4. [AmazonS3FullAccess] をアタッチします。

デプロイステージの完了

デプロイステージには、Lambda アプリケーションを管理する AWS CloudFormation スタックの変更セットを作成するアクションがあります。変更セットは、新しいリソースの追加や既存のリソースの更新など、スタックに行われる変更を指定します。変更セットを使用すると、変更セットを作成する前に加えられた変更をプレビューして、承認ステージを追加できます。デプロイを完了するには、変更セットを実行する 2 番目のアクションを追加します。

デプロイステージを更新するには

  1. 開発者向けツールコンソール」でパイプラインを開きます。

  2. [Edit] を選択します。

  3. [デプロイ] の横にある [ステージを編集] を選択します。

  4. [アクショングループの追加] を選択します。

  5. デプロイステージ設定を行い、[次へ] を選択します。

    • アクション名execute-changeset

    • アクションプロバイダAWS CloudFormation

    • 入力アーティファクトBuildArtifact

    • アクションモード変更セットの実行

    • スタック名lambda-pipeline-stack

    • 変更セット名lambda-pipeline-changeset

  6. [Done] を選択します。

  7. [Save] を選択します。

  8. [変更のリリース] を選択して、パイプラインを実行します。

パイプラインの準備が完了しました。マスターブランチに変更をプッシュして、デプロイをトリガーします。

アプリケーションのテスト

アプリケーションには、現在の時刻を返すパブリックエンドポイントのある API Gateway API が含まれています。Lambda コンソールを使用してアプリケーションを表示し、API にアクセスします。

アプリケーションをテストするには

  1. [アプリケーション] を選択します。

  2. [lambda-pipeline-stack] を選択します。

  3. [リソース] で、[ServerlessRestApi] を展開します。

  4. [Prod API エンドポイント] を選択します。

  5. URL の末尾に /TimeResource を追加します。たとえば、https://l193nqxdjj.execute-api.us-east-2.amazonaws.com/Prod/TimeResource と指定します。

  6. URL を開きます。

API は次の形式で現在の時刻を返します。

The time in Los Angeles is: Thu Jun 27 2019 16:07:20 GMT-0700 (PDT)