メニュー
AWS Lambda
開発者ガイド

Lambda ベースのアプリケーションのデプロイメントを自動化する

前のセクションでは、SAM テンプレートを作成し、デプロイメントパッケージを生成し、AWS CLI を使用してサーバーレスアプリケーションを手動でデプロイする使用方法について学習しました。このセクションでは、次の AWS サービスを活用してデプロイメントプロセスを完全に自動化します。

  • CodePipeline: CodePipeline を使用して、サーバーレスアプリケーションをリリースするために必要なステップをモデル化し、視覚化し、自動化します。詳細については、「AWS CodePipeline とは何か」を参照してください

  • CodeBuild: CodeBuild を使用して、サーバーレスアプリケーションを構築、ローカルテスト、およびパッケージ化します。詳細については、「AWS Codebuild とは何か」を参照してください

  • AWS CloudFormation: AWS CloudFormation を使用してアプリケーションをデプロイします。詳細については、「AWS CloudFormation とは何か」を参照してください

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

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

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

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

    1. IAM コンソール (https://console.aws.amazon.com/iam/) にサインインします。

    2. IAM ユーザーガイドAWS サービスにアクセス許可を委任するロールの作成の手順に従って、IAM ロール (実行ロール) を作成します。ロールを作成するステップに従うときに、次のことに注意してください。

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

      • [Select Role Type] で、[AWS Service Roles] を選択し、[AWS CloudFormation] を選択します。これにより、ロールを引き受けるアクセス権限を AWS CloudFormation サービスに付与します。

      • [Attach Policy] で、[AWSLambdaExecute] を選択します。

      • 先ほど作成したロールを開き、[Permissions] タブ内で [Inline Policies] を展開して [Create Role Policy] を選択します。

      • [Custom Policy] を選択して [Select] を選択します。

      • [Policy Name] に、カスタムポリシーの名前を入力し、[Policy Document] フィールドに以下を貼り付けます。

        Copy
        { "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:account-id:function:*" ], "Effect": "Allow" }, { "Action": [ "apigateway:*" ], "Resource": [ "arn:aws:apigateway:region::*" ], "Effect": "Allow" }, { "Action": [ "iam:GetRole", "iam:CreateRole", "iam:DeleteRole" ], "Resource": [ "arn:aws:iam::account-id:role/*" ], "Effect": "Allow" }, { "Action": [ "iam:AttachRolePolicy", "iam:DetachRolePolicy" ], "Resource": [ "arn:aws:iam::account-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" } ], "Version": "2012-10-17" }
      • [Validate Policy] を選択して [Apply Policy] を選択します。

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

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

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

    Copy
    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 ファイルを追加します。これはアプリケーションのリソースを定義する SAM テンプレートです。この SAMの テンプレートは API ゲートウェイ によってトリガーされる Lambda 関数を定義します。runtime パラメータは nodejs6.10 を使用しますが、nodejs4.3 も指定できることに注意してください。AWS SAM についての詳細は、「AWS サーバーレスアプリケーションモデル化」を参照してください。

    Copy
    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 バケットへのローカルアーティファクトのアップロード」を参照してください

      Copy
      version: 0.1 phases: install: commands: - npm install time - aws cloudformation package --template-file samTemplate.yaml --s3-bucket bucket-name --output-template-file NewSamTemplate.yaml artifacts: type: zip files: - NewSamTemplate.yaml

      SAM でデプロイメントパッケージを手動でパッケージ化する場合の手順と同様に、--s3-bucket パラメーターの値と Amazon S3 バケットの名前を指定する必要があることに注意してください。 前のチュートリアルの 梱包 ステップでこれについて説明しています。

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

AWS CodePipeline を作成するには、次のステップに従ってください。

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

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

  3. [Pipeline name:] にパイプラインの名前を入力し、[Next step] を選択します。

  4. [Source provider:] で、[GitHub] を選択します。

  5. [Connect to GitHub:] を選択して、接続する [Repository ] および [Branch] を選択します。選択したブランチへの git はパイプラインをトリガーします。Next step を選択します。

  6. [AWS CodeBuild] を [Build provider] として選択します。

  7. [Create a new build project] を選択し、プロジェクト名を入力します。

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

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

  10. [Version] で、aws/codebuild/nodejs:4.3.2 を選択します。

  11. Save build project を選択します。

    注記

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

    Next step を選択します。

  12. [Deployment provider:] で、[AWS CloudFormation] を選択します。

    このオプションを選択すると、AWS CloudFormation コマンドが SAM テンプレートのデプロイに使用されます。詳細については、「AWS CloudFormation 内のサーバーレスリソース」を参照してください。

  13. [Action mode:] で、[create or replace a change set] を選択します。

  14. [Stack name:] に [MyBetaStack] と入力します。

  15. [Change set name:] に [MyChangeSet] と入力します。

  16. [Template file:] に [NewSamTemplate.yaml] と入力します。

  17. [Capabilities:] で、[CAPABILITY_IAM] を選択します。

  18. [Role] で、このチュートリアルの最初に作成した AWS CloudFormation ロールを選択し、[Next step] を選択します。

  19. Create role を選択します。[Next]、[Allow.]、[Next step] の順に選択します。

  20. パイプラインを確認して、[Create pipeline] を選択します。

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

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

  1. IAM マネジメントコンソールに移動します。

  2. Roles を選択します。

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

  4. [Permissions] タブで、[Attach Policy] を選択します。

  5. [Permissions] タブで、[Create Role Policy] を選択します。

  6. [Policy Generator] を選択して [Select] を選択します。

  7. [AWS Service] リストで、[Amazon S3] を選択します。

  8. [Actions] で、[PutObject] を選択します。

  9. [Amazon Resource Name (ARN)] に arn:aws:s3:::bucket-name* と入力します。

  10. [Add Statement] を選択して [Next Step] を選択します。

  11. [Review Policy] で、[Validate Policy] を選択し、[Apply Policy] を選択します。

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

ベータ段階を完了するには次のステップに従ってください。

  1. Edit を選択します。

  2. アイコンを選択します。これはベータ段階用のものです。

  3. ベータ段階では、既存のアクションの最後にある [+ Action] アイコンを選択します。

  4. [Category:] で、[Deploy] を選択します。

  5. [Action:] に [execute_cs] と入力します。

  6. [Deployment provider:] で、[AWS CloudFormation] を選択します。

  7. [Action mode: ] で、[execute a changeset] を選択します。これは、前回のチュートリアルの デプロイメント のステップで説明したように、手動でパッケージをデプロイする場合のステップと類似しています。CreateChangeSet は SAM テンプレートを完全な AWS CloudFormation 形式に変換し、deployChangeSet がその AWS CloudFormation テンプレートをデプロイします。

  8. [Stack name: ] に [MyBetaStack] と入力します。

  9. [Change set name: ] に [MyChangeSet] と入力します。

  10. Add action を選択します。

  11. Save pipeline changes を選択します。

  12. Save and continue を選択します。

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

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

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