AWS Lambda
開発者ガイド

サーバーレスアプリケーションのパイプラインを構築する

次のチュートリアルでは、サーバーレスアプリケーションのデプロイメントを自動化する AWS CodePipeline を作成します。まず、パイプラインをトリガーするためにソースステージを設定する必要があります。このチュートリアルでは、以下のことを行います。

  • GitHub を使用しています。GitHub リポジトリを作成する手順については、「GitHub でリポジトリを作成する」を参照してください。

  • 次のステップに示すように、AWS CloudFormation ロールを作成し、そのロールに [AWSLambdaExecute] ポリシーを追加します。

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

    2. IAM ユーザーガイド の「AWS のサービスにアクセス許可を委任するロールの作成」の手順に従って、IAM ロール (実行ロール) を作成します。次に、[To create a role for an AWS service (AWS のサービスのロールを作成するには)] セクションに移動します。ロールを作成するステップに従うときに、次のことに注意してください。

      • [ロールタイプの選択] で [AWS サービスロール] を選択し、続いて [CloudFormation] を選択します。[Next: Permissions (次へ: アクセス許可)] を選択します。

      • [アクセス権限ポリシーをアタッチする] では、検索バーを使用して検索し、[AWSLambdaExecute] を選択します。[Next: Review] を選択します。

      • [Role Name (ロール名)] では、AWS アカウント内で一意の名前 (たとえば、cloudformation-lambda-execution-role) を使用し、[Create role (ロールの作成)] を選択します。

      • 先ほど作成したロールを開きます。[アクセス許可] タブで [インラインポリシーの追加] を選択します。

      • [Create Policy (ポリシーの作成)] で [JSON] タブを選択し、次を入力します。

        注記

        regionid のプレースホルダーはお客様のリージョンとアカウント ID に置き換えてください。

        { "Statement": [ { "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:GetBucketVersioning" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::codepipeline*" ], "Effect": "Allow" }, { "Action": [ "lambda:*" ], "Resource": [ "arn:aws:lambda:region:id:function:*" ], "Effect": "Allow" }, { "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:region::*" ], "Effect": "Allow" }, { "Action": [ "iam:GetRole", "iam:CreateRole", "iam:DeleteRole", "iam:PutRolePolicy" ], "Resource": [ "arn:aws:iam::id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:AttachRolePolicy", "iam:DeleteRolePolicy", "iam:DetachRolePolicy" ], "Resource": [ "arn:aws:iam::id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:PassRole" ], "Resource": [ "*" ], "Effect": "Allow" }, { "Action": [ "cloudformation:CreateChangeSet" ], "Resource": [ "arn:aws:cloudformation:region:aws:transform/Serverless-2016-10-31" ], "Effect": "Allow" }, { "Action": [ "codedeploy:CreateApplication", "codedeploy:DeleteApplication", "codedeploy:RegisterApplicationRevision" ], "Resource": [ "arn:aws:codedeploy:region:id:application:*" ], "Effect": "Allow" }, { "Action": [ "codedeploy:CreateDeploymentGroup", "codedeploy:CreateDeployment", "codedeploy:GetDeployment" ], "Resource": [ "arn:aws:codedeploy:region:id:deploymentgroup:*" ], "Effect": "Allow" }, { "Action": [ "codedeploy:GetDeploymentConfig" ], "Resource": [ "arn:aws:codedeploy:region:id:deploymentconfig:*" ], "Effect": "Allow" } ], "Version": "2012-10-17" }
      • [Validate Policy] を選択して、[Apply Policy] を選択します。

ステップ 1: リポジトリの設定

リポジトリの設定には、Lambda がサポートする任意のランタイムを使用できます。次の例では、Node.js を使用します。

リポジトリを設定するには、次の通りに実行します:

  • 以下のコードを含む index.js file を追加します。

    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(), }); };
  • 以下のコンテンツを含む samTemplate.yaml ファイルを追加します。これは、アプリケーションのリソースを定義する AWS SAM テンプレートです。この AWS SAM テンプレートは API Gateway によってトリガーされる Lambda 関数を定義します。runtime パラメータは nodejs6.10 を使用しますが、nodejs8.10 も指定できることに注意してください。AWS SAM についての詳細は、「AWS サーバーレスアプリケーションモデル化」を参照してください。

    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: nodejs6.10 CodeUri: ./ Events: MyTimeApi: Type: Api Properties: Path: /TimeResource Method: GET
  • buildspec.yml ファイルを追加します。ビルド仕様は、AWS CodeBuild がビルドを実行するために使用する YAML 形式のビルドコマンドと関連設定のコレクションです。詳細については、「AWS CodeBuild の ビルド仕様リファレンス」を参照してください。この例では、ビルドアクションは次のとおりです。

    • npm を使用して時間パッケージをインストールします。

    • Package コマンドを実行して、パイプラインの段階的なデプロイメントステップでデプロイパッケージを準備します。パッケージコマンドの詳細については、「S3 バケットへのローカルアーティファクトのアップロード」を参照してください。

      version: 0.2 phases: install: commands: - npm install time - aws cloudformation package --template-file samTemplate.yaml --kms-key-id kms-key-id --s3-bucket bucket-name --output-template-file outputSamTemplate.yaml artifacts: type: zip files: - samTemplate.yaml - outputSamTemplate.yaml

ステップ 2: パイプラインの作成

AWS CodePipeline を作成するには、次の手順に従います。

  1. AWS マネジメントコンソール にサインインして、AWS CodePipeline コンソールを開きます。

  2. [Get Started Now] を選択します。

  3. [パイプラインの名前] ボックスにパイプラインの名前を入力し、[次のステップ] を選択します。

  4. [ソースプロバイダー] で [GitHub] を選択します。

  5. [Connect to GitHub に接続] を選択したら、接続するリポジトリブランチを選択します。選択したブランチへの git push はパイプラインをトリガーします。[Next step] を選択します。

  6. [AWS CodeBuild] をビルドプロバイダとして選択します。

  7. ビルドプロジェクトの新規作成 を選択してプロジェクト名を入力します。

  8. Ubuntu をオペレーションシステムに選択します。

  9. Node.js をランタイムに選択します。

  10. [バージョン] で aws/codebuild/nodejs:version を選択します。

  11. [ビルド仕様] で Use the buildspec.yml in the source code root directory を選択します。

  12. ビルドプロジェクトの保存 を選択します。

    注記

    AWS CodeBuild のサービスロールがユーザーに代わり自動的に作成されます。

    [Next step] を選択します。

  13. [デプロイプロバイダー] で [AWS CloudFormation] を選択します。

    このオプションを選択すると、AWS SAM テンプレートをデプロイするために AWS CloudFormation コマンドが使用されます。詳細については、『AWS サーバーレスアプリケーションモデル 開発者ガイド』の「AWS SAM テンプレートの基本」を参照してください。

  14. [アクションモード] で [変更セットの作成または置換] を選択します。

  15. [スタックの名前] に「MyBetaStack」と入力します。

  16. [セット名の変更] で「MyChangeSet」と入力します。

  17. [テンプレートファイル] で「outputSamTemplate.yaml」と入力します。

  18. [設備] で [CAPABILITY_IAM] を選択します。

  19. [ロール] で、このチュートリアルの最初に作成した AWS CloudFormation ロールを選択し、[次のステップ] を選択します。

  20. [ロールの作成]、[次へ]、[Allow (許可)]、[次のステップ] の順に選択します。

  21. パイプラインを確認し、パイプラインの作成 を選択します。

ステップ 3: 生成されたサービスポリシーを更新する

以下のステップを完了して、AWS CodeBuild が Amazon S3 バケットにビルドアーティファクトをアップロードできるようにします。

  1. IAM コンソールに移動します。

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

  3. プロジェクト用に生成されたサービスロール — (通常は code-build-project-name-service-role) を開きます。

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

  5. [サービス] で [サービスの選択] を選択します。

  6. [以下のサービスを選択してください] で [S3] を選択します。

  7. [アクション] で [アクションの選択] を選択します。

  8. [アクセスレベルグループ] で [書き込み] を展開し、[PutObject] を選択します。

  9. [リソース] を選択し、[すべて] チェックボックスを選択します。

  10. [ポリシーの確認] を選択します。

  11. [名前] を入力し、[ポリシーの作成] を選択します。続いて、前のセクションで作成したパイプラインに戻ります。

ステップ 4: ベータデプロイメント段階を完了する

ベータ段階を完了するには次のステップを使用します。

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

  2. [MyBetaStack] の横の + アイコンを選択します。

  3. [アクションカテゴリー:] で [デプロイ] が選択されていない場合には、選択します。

  4. [デプロイプロバイダー] で [AWS CloudFormation] が選択されていない場合には、選択します。

  5. [アクションモード] で、[変更セットの実行] を選択します。CreateChangeSet は AWS SAM テンプレートを完全な AWS CloudFormation 形式に変換し、deployChangeSet がその AWS CloudFormation テンプレートをデプロイします。

  6. [スタックの名前] で「MyBetaStack」を入力または選択します。

  7. [セット名の変更] で「MyChangeSet」と入力します。

  8. [Add action] を選択します。

  9. [パイプラインの変更を保存する] を選択します。

  10. [Save and continue] を選択します。

パイプラインの準備が完了しました。このパイプラインに接続するブランチへの git push はデプロイをトリガーします。パイプラインをテストし、アプリケーションを初めてデプロイする場合、次のいずれかを実行します:

  • パイプラインに接続されているブランチに git push を実行します。

  • AWS CodePipeline コンソールに移動して、作成したパイプラインの名前を選択し、[変更のリリース] を選択します。