チュートリアル: サーバーレスアプリケーションをデプロイする
このチュートリアルでは、ワークフローを使用してサーバーレスアプリケーションを CloudFormation スタックとしてビルド、テスト、デプロイする方法について説明します。
このチュートリアルのアプリケーションは、「Hello World」メッセージを出力するシンプルなウェブアプリケーションです。AWS Lambda 関数と Amazon API Gateway で構成され、AWS CloudFormation の拡張機能である AWS Serverless Application Model (AWS SAM) を使用してビルドします。
トピック
前提条件
開始する前に:
-
接続された AWS アカウントを持つ CodeCatalyst スペース が必要です。詳細については、「スペースを作成する」を参照してください。
-
スペースには、次の名前の空のプロジェクトが必要です。
codecatalyst-cfn-project
このプロジェクトを作成するには、[ゼロから開始] オプションを使用します。
詳細については、「Amazon CodeCatalyst での空のプロジェクトの作成」を参照してください。
-
プロジェクトには、以下と呼ばれる CodeCatalyst [環境] が必要です。
codecatalyst-cfn-environment
この環境を次のように設定します。
-
[非本番稼働用] など、任意のタイプを選択します。
-
AWS アカウントに接続します。
-
[デフォルトの IAM ロール] で、任意のロールを選択します。後で別のロールを指定します。
詳細については、「AWS アカウント と VPC へのデプロイ」を参照してください。
-
ステップ 1: ソースレポジトリを作成する
このステップでは、CodeCatalyst に空のソースリポジトリを作成します。このリポジトリは、Lambda 関数ファイルなどのチュートリアルのソースファイルを保存するために使用されます。
ソースリポジトリの詳細については、「ソースリポジトリを作成する」を参照してください。
ソースリポジトリを作成するには
-
ナビゲーションペインの CodeCatalyst で [コード] を選択してから、[ソースリポジトリ] を選択します。
-
[リポジトリの追加] を選択し、[リポジトリの作成] を選択します。
-
[リポジトリ名] に次のように入力します。
codecatalyst-cfn-source-repository
-
[Create] (作成) を選択します。
これで、codecatalyst-cfn-source-repository
というリポジトリが作成されました。
ステップ 2: AWS ロールを作成する
このステップでは、次の AWS IAM ロールを作成します。
-
ロールのデプロイ – CodeCatalyst [AWS CloudFormation スタックをデプロイ] アクションに、サーバーレスアプリケーションをデプロイする AWS アカウントと CloudFormation サービスにアクセスする許可を付与します。[AWS CloudFormation スタックをデプロイ] アクションはワークフローの一部です。
-
ビルドロール – CodeCatalyst ビルドアクションに、AWS アカウントにアクセスして、サーバーレスアプリケーションパッケージが保存される Amazon S3 に書き込むアクセス許可を付与します。ビルドアクションはワークフローの一部です。
-
スタックロール – 後で提供する AWS SAM テンプレートで指定されたリソースを読み取って変更するアクセス許可を CloudFormation に付与します。また、CloudWatch にアクセス許可を付与します。
IAM ロールの詳細については、「AWS Identity and Access Management ユーザーガイド」の「IAM ロール」を参照してください。
注記
時間を節約するため、前に一覧表示した 3 つのロールではなく、CodeCatalystWorkflowDevelopmentRole-
ロールと呼ばれる 1 つのロールを作成できます。詳細については、「アカウントとスペース用の CodeCatalystWorkflowDevelopmentRole-spaceName ロールを作成する」を参照してください。spaceName
CodeCatalystWorkflowDevelopmentRole-
ロールには、セキュリティリスクをもたらす可能性のある非常に広範なアクセス許可があることを理解します。このロールは、セキュリティが懸念されないチュートリアルやシナリオでのみ使用することをお勧めします。このチュートリアルでは、前述の 3 つのロールを作成することを前提としています。spaceName
注記
[Lambda 実行ロール] も必要ですが、ステップ 5 でワークフローを実行するときに sam-template.yml
ファイルが作成するため、今すぐ作成する必要はありません。
デプロイロールを作成するには
-
ロールのポリシーを以下の手順で作成します。
-
AWS にサインインします。
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで、ポリシー を選択します。
-
[ポリシーの作成] を選択します。
-
[JSON] タブを選択します。
-
既存のコードを削除します。
-
次のコードを貼り付けます。
{ "Version": "2012-10-17", "Statement": [{ "Action": [ "cloudformation:CreateStack", "cloudformation:DeleteStack", "cloudformation:Describe*", "cloudformation:UpdateStack", "cloudformation:CreateChangeSet", "cloudformation:DeleteChangeSet", "cloudformation:ExecuteChangeSet", "cloudformation:SetStackPolicy", "cloudformation:ValidateTemplate", "cloudformation:List*", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
注記
ロールがワークフローアクションの実行に初めて使用されるときは、リソースポリシーステートメントでワイルドカードを使用し、利用可能になった後にリソース名でポリシーの範囲を絞り込みます。
"Resource": "*"
-
[Next: Tags] (次へ: タグ) を選択します。
-
[次へ: レビュー] を選択します。
-
[名前] に次のように入力します。
codecatalyst-deploy-policy
-
[ポリシーの作成] を選択します。
これで、アクセス許可ポリシーが作成されました。
-
-
次のようにデプロイロールを作成します。
-
ナビゲーションペインで ロール を選択してから、ロールを作成する を選択します。
-
[カスタム信頼ポリシー] を選択します。
-
既存のカスタム信頼ポリシーを削除します。
-
次の信頼ポリシーを追加します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
-
[Next] を選択します。
-
[アクセス許可ポリシー] で
codecatalyst-deploy-policy
を検索し、チェックボックスをオンにします。 -
[Next] を選択します。
-
[ロール名] には、次のように入力します。
codecatalyst-deploy-role
-
[ロールの説明] には、次のように入力します。
CodeCatalyst deploy role
-
[ロールの作成] を選択します。
これで、信頼ポリシーとアクセス許可ポリシーを使用してデプロイロールが作成されました。
-
-
デプロイロール ARN を次のように取得します。
-
ナビゲーションペインで Roles (ロール) を選択します。
-
検索ボックスに、作成したロールの名前 (
codecatalyst-deploy-role
) を入力します。 -
使用するロールを一覧から選択します。
ロールの [概要] ページが表示されます。
-
上部で、[ARN] 値をコピーします。
これで、適切なアクセス許可を持つデプロイロールを作成し、ARN を取得しました。
-
ビルドロールを作成するには
-
ロールのポリシーを以下の手順で作成します。
-
AWS にサインインします。
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで、ポリシー を選択します。
-
[ポリシーの作成] を選択します。
-
[JSON] タブを選択します。
-
既存のコードを削除します。
-
次のコードを貼り付けます。
{ "Version": "2012-10-17", "Statement": [{ "Action": [ "s3:PutObject", "iam:PassRole" ], "Resource": "*", "Effect": "Allow" }] }
注記
ロールがワークフローアクションの実行に初めて使用されるときは、リソースポリシーステートメントでワイルドカードを使用し、利用可能になった後にリソース名でポリシーの範囲を絞り込みます。
"Resource": "*"
-
[Next: Tags] (次へ: タグ) を選択します。
-
[次へ: レビュー] を選択します。
-
[名前] に次のように入力します。
codecatalyst-build-policy
-
[ポリシーの作成] を選択します。
これで、アクセス許可ポリシーが作成されました。
-
-
次のようにビルドロールを作成します。
-
ナビゲーションペインで ロール を選択してから、ロールを作成する を選択します。
-
[カスタム信頼ポリシー] を選択します。
-
既存のカスタム信頼ポリシーを削除します。
-
次の信頼ポリシーを追加します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
-
[Next] を選択します。
-
[アクセス許可ポリシー] で
codecatalyst-build-policy
を検索し、チェックボックスをオンにします。 -
[Next] を選択します。
-
[ロール名] には、次のように入力します。
codecatalyst-build-role
-
[ロールの説明] には、次のように入力します。
CodeCatalyst build role
-
[ロールの作成] を選択します。
これで、信頼ポリシーとアクセス許可ポリシーを使用してビルドロールが作成されました。
-
-
次のようにビルドロール ARN を取得します。
-
ナビゲーションペインで Roles (ロール) を選択します。
-
検索ボックスに、作成したロールの名前 (
codecatalyst-build-role
) を入力します。 -
使用するロールを一覧から選択します。
ロールの [概要] ページが表示されます。
-
上部で、[ARN] 値をコピーします。
これで、適切なアクセス許可を持つビルドロールを作成し、その ARN を取得しました。
-
スタックロールを作成するには
-
スタックをデプロイするアカウントを使用して AWS にサインインします。
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
次のようにスタックロールを作成します。
-
ナビゲーションペインで Roles (ロール) を選択します。
-
[ロールの作成] を選択します。
-
[AWS サービス] を選択してください。
-
[ユースケース] セクションで、ドロップダウンリストから [CloudFormation] を選択します。
-
[CloudFormation] ラジオボタンを選択します。
-
下部で、[次へ] を選択します。
-
検索ボックスを使用して、次のアクセス許可ポリシーを検索し、それぞれのチェックボックスをオンにします。
注記
ポリシーを検索してもポリシーが表示されない場合は、[フィルターをクリア] を選択して再試行してください。
-
CloudWatchFullAccess
-
AWSCloudFormationFullAccess
-
IAMFullAccess
-
AWSLambda_FullAccess
-
AmazonAPIGatewayAdministrator
-
AmazonS3FullAccess
-
AmazonEC2ContainerRegistryFullAccess
最初のポリシーでは、CloudWatch へのアクセスを許可し、アラームが発生したときにスタックのロールバックを有効にします。
残りのポリシーでは、 このチュートリアルでデプロイされるスタック内のサービスとリソースに AWS SAM がアクセスできるようになります。詳細については、「AWS Serverless Application Model デベロッパーガイド」の「アクセス許可」を参照してください。
-
-
[Next] を選択します。
-
[ロール名] には、次のように入力します。
codecatalyst-stack-role
-
[ロールの作成] を選択します。
-
-
次のように、スタックロールの ARN を取得します。
-
ナビゲーションペインで Roles (ロール) を選択します。
-
検索ボックスに、作成したロールの名前 (
codecatalyst-stack-role
) を入力します。 -
使用するロールを一覧から選択します。
-
[概要] セクションの [ARN] 値をコピーします。これは、後で必要になります。
これで、適切なアクセス許可を持つスタックロールを作成し、ARN を取得しました。
-
ステップ 3: CodeCatalyst に AWS ロールを追加する
このステップでは、ビルドロール (codecatalyst-build-role
) を追加し、スペース内の CodeCatalyst アカウント接続にロール (codecatalyst-deploy-role
) をデプロイします。
注記
スタックロール (codecatalyst-stack-role
) を接続に追加する必要はありません。これは、デプロイロールを使用して、CodeCatalyst と AWS 間で接続が既に確立された後、スタックロールが [CloudFormation] (CodeCatalyst ではない) で使用されるためです。スタックロールは、CodeCatalyst が AWS にアクセスするために使用するものではないため、アカウント接続に関連付ける必要はありません。
ビルドロールとデプロイロールをアカウント接続に追加するには
-
CodeCatalyst で、スペースに移動します。
-
[AWS アカウント] を選択します。アカウント接続が一覧表示されます。
-
ビルドロールとデプロイロールを作成したアカウントを表す AWS アカウント接続を選択します。
-
[AWS 管理コンソールからロールの管理] を選択します。
[Amazon CodeCatalyst スペースに IAM ロールの追加] ページが表示されます。ページにアクセスするには、サインインが必要な場合があります。
-
[IAM で作成した既存のロールを追加] を選択します。
ドロップダウンリストが表示されます。この一覧表示には、
codecatalyst-runner.amazonaws.com
およびcodecatalyst.amazonaws.com
サービスプリンシパルを含む信頼ポリシーを持つすべての IAM ロールが表示されます。 -
ドロップダウンリストで [
codecatalyst-build-role
] を選択し、[ロールを追加] を選択します。 -
[IAM ロールを追加] を選択し、[IAM で作成した既存のロールを追加] を選択し、ドロップダウンリストから [
codecatalyst-deploy-role
] を選択します。[Add role] を選択します。これで、ビルドロールとデプロイロールをスペースに追加しました。
-
[Amazon CodeCatalyst 表示名] の値をコピーします。この値は、ワークフローを作成するときに後で必要になります。
ステップ 4: Amazon S3 バケットを作成する
このステップでは、サーバーレスアプリケーションのデプロイパッケージ .zip ファイルを保存する Amazon S3 バケットを作成します。
Amazon S3 バケットを作成するには
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 -
メインペインで、[バケットを作成] を選択します。
-
[バケット名] に、次のように入力します。
codecatalyst-cfn-s3-bucket
-
[AWS リージョン] で、リージョンを選択します。このチュートリアルは、[米国西部 (オレゴン) us-west-2] を選択していることを前提としています。Amazon S3 がサポートしているリージョンについては、「AWS 全般のリファレンス」の「Amazon Simple Storage Service エンドポイントとクォータ」を参照してください。
-
ページ下部にある [バケットを作成] ボタンを選択します。
これで、米国西部 (オレゴン) us-west-2 リージョンで codecatalyst-cfn-s3-bucket
という名前のバケットが作成されました。
ステップ 5: ソースファイルを追加する
このステップでは、CodeCatalyst ソースリポジトリに複数のアプリケーションソースファイルを追加します。hello-world
フォルダには、デプロイするアプリケーションファイルが含まれています。tests
フォルダにはユニットテストが含まれています。フォルダは次のような構造になっています。
. |— hello-world | |— tests | |— unit | |— test-handler.js | |— app.js |— .npmignore |— package.json |— sam-template.yml |— setup-sam.sh
.npmignore ファイル
.npmignore
ファイルは、アプリケーションパッケージから npm を除外するファイルとフォルダを示します。このチュートリアルでは、npm はアプリケーションの一部ではないため、tests
フォルダを除外します。
.npmignore ファイルを追加するには
https://codecatalyst.aws/
で CodeCatalyst コンソールを開きます。 -
プロジェクト「
codecatalyst-cfn-project
」を選択します。 -
ナビゲーションペインで [コード] を選択してから、[ソースリポジトリ] を選択します。
-
ソースリポジトリのリストから、リポジトリ「
codecatalyst-cfn-source-repository
」を選択します。 -
[ファイル] で、[ファイルを作成] を選択します。
-
[ファイル名] に次のように入力します。
.npmignore
-
テキストボックスに次のコードを入力します。
tests/*
-
[コミット] を選択し、再度 [コミット] を選択します。
これで、リポジトリのルートに
.npmignore
という名前のファイルが作成されました。
package.json ファイル
package.json
ファイルには、プロジェクト名、バージョン番号、説明、依存関係、およびアプリケーションとやり取りして実行する方法を説明するその他の詳細など、Node プロジェクトに関する重要なメタデータが含まれています。
このチュートリアルの package.json
には、依存関係の一覧と test
スクリプトが含まれています。スクリプトは、次を実行します。
-
[mocha]
を使用して、テストスクリプトは hello-world/tests/unit/
で指定されたユニットテストを実行し、[xunit] レポーターを使用して結果をjunit.xml
ファイルに書き込みます。 -
[Istanbul (nyc)]
を使用すると、テストスクリプトは [clover] レポーターを使用してコードカバレッジレポート ( clover.xml
) を生成します。詳細については、「Istanbul ドキュメント」の「代替レポーターの使用」を参照してください。
package.json ファイルを追加するには
-
リポジトリの [ファイル] で、[ファイルを作成] を選択します。
-
[ファイル名] に次のように入力します。
package.json
-
テキストボックスに次のコードを入力します。
{ "name": "hello_world", "version": "1.0.0", "description": "hello world sample for NodeJS", "main": "app.js", "repository": "https://github.com/awslabs/aws-sam-cli/tree/develop/samcli/local/init/templates/cookiecutter-aws-sam-hello-nodejs", "author": "SAM CLI", "license": "MIT", "dependencies": { "axios": "^0.21.1", "nyc": "^15.1.0" }, "scripts": { "test": "nyc --reporter=clover mocha hello-world/tests/unit/ --reporter xunit --reporter-option output=junit.xml" }, "devDependencies": { "aws-sdk": "^2.815.0", "chai": "^4.2.0", "mocha": "^8.2.1" } }
-
[コミット] を選択し、再度 [コミット] を選択します。
これで、リポジトリのルートに「
package.json
」という名前のファイルが追加されました。
sam-template.yml ファイル
sam-template.yml
ファイルには、Lambda 関数と API Gateway をデプロイし、それらを一緒に設定するための手順が含まれています。これは、[AWS Serverless Application Model テンプレート仕様] を拡張する AWS CloudFormation テンプレート仕様に従います。
便利な [AWS::Serverless::Function] リソースタイプを提供するため、このチュートリアルでは通常の AWS CloudFormation テンプレートの代わりに AWS SAM テンプレートを使用します。このタイプは、基本的な CloudFormation 構文を使用するために通常書き出す必要がある behind-the-scenes の設定を多く実行します。例えば、AWS::Serverless::Function
は、関数を開始する Lambda 関数、Lambda 実行ロール、およびイベントソースマッピングを作成します。基本的な CloudFormation を使用して書き込む場合は、これらすべてをコーディングする必要があります。
このチュートリアルでは、事前に作成されたテンプレートを使用しますが、ビルドアクションを使用してワークフローの一部として作成できます。詳細については、「AWS CloudFormation スタックのデプロイ」を参照してください。
sam-template.yml ファイルを追加するには
-
リポジトリの [ファイル] で、[ファイルを作成] を選択します。
-
[ファイル名] に次のように入力します。
sam-template.yml
-
テキストボックスに次のコードを入力します。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > serverless-api Sample SAM Template for serverless-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function # For details on this resource type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello-world/ Handler: app.lambdaHandler Runtime: nodejs12.x Events: HelloWorld: Type: Api # For details on this event source type, see https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Outputs: # ServerlessRestApi is an implicit API created out of the events key under Serverless::Function # Find out about other implicit resources you can reference within AWS SAM at # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api HelloWorldApi: Description: "API Gateway endpoint URL for the Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit Lambda execution role created for the Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn
-
[コミット] を選択し、再度 [コミット] を選択します。
これで、リポジトリのルートフォルダに「
sam-template.yml
」という名前のファイルが追加されました。
setup-sam.sh ファイル
setup-sam.sh
ファイルには、AWS SAM CLI ユーティリティをダウンロードしてインストールする手順が含まれています。ワークフローは、このユーティリティを使用して hello-world
ソースをパッケージ化します。
setup-sam.sh ファイルを追加するには
-
リポジトリの [ファイル] で、[ファイルを作成] を選択します。
-
[ファイル名] に次のように入力します。
setup-sam.sh
-
テキストボックスに次のコードを入力します。
#!/usr/bin/env bash echo "Setting up sam" yum install unzip -y curl -LO https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip unzip -qq aws-sam-cli-linux-x86_64.zip -d sam-installation-directory ./sam-installation-directory/install; export AWS_DEFAULT_REGION=
us-west-2
上記のコードでは、
[us-west-2]
を AWS リージョンに置き換えます。 -
[コミット] を選択し、再度 [コミット] を選択します。
これで、リポジトリのルートに「
setup-sam.sh
」という名前のファイルが追加されました。
app.js ファイル
app.js
には、Lambda 関数のコードが含まれます。このチュートリアルでは、hello world
コードはテキストを返します。
app.js ファイルを追加するには
-
リポジトリの [ファイル] で、[ファイルを作成] を選択します。
-
[ファイル名] に次のように入力します。
hello-world/app.js
-
テキストボックスに次のコードを入力します。
// const axios = require('axios') // const url = 'http://checkip.amazonaws.com/'; let response; /** * * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format * @param {Object} event - API Gateway Lambda Proxy Input Format * * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html * @param {Object} context * * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html * @returns {Object} object - API Gateway Lambda Proxy Output Format * */ exports.lambdaHandler = async (event, context) => { try { // const ret = await axios(url); response = { 'statusCode': 200, 'body': JSON.stringify({ message: 'hello world', // location: ret.data.trim() }) } } catch (err) { console.log(err); return err; } return response };
-
[コミット] を選択し、再度 [コミット] を選択します。
これで、「
hello-world
」というフォルダと「app.js
」というファイルが作成されました。
test-handler.js ファイル
test-handler.js
ファイルには、Lambda 関数の単位テストが含まれています。
test-handler.js ファイルを追加するには
-
リポジトリの [ファイル] で、[ファイルを作成] を選択します。
-
[ファイル名] に次のように入力します。
hello-world/tests/unit/test-handler.js
-
テキストボックスに次のコードを入力します。
'use strict'; const app = require('../../app.js'); const chai = require('chai'); const expect = chai.expect; var event, context; describe('Tests index', function () { it('verifies successful response', async () => { const result = await app.lambdaHandler(event, context) expect(result).to.be.an('object'); expect(result.statusCode).to.equal(200); expect(result.body).to.be.an('string'); let response = JSON.parse(result.body); expect(response).to.be.an('object'); expect(response.message).to.be.equal("hello world"); // expect(response.location).to.be.an("string"); }); });
-
[コミット] を選択し、再度 [コミット] を選択します。
これで、
hello-world/tests/unit
フォルダの下位に「test-handler.js
」というファイルが追加されました。
これで、すべてのソースファイルが追加されました。
少し時間を取って作業を再確認し、すべてのファイルを正しいフォルダに配置してください。フォルダは次のような構造になっています。
. |— hello-world | |— tests | |— unit | |— test-handler.js | |— app.js |— .npmignore |— README.md |— package.json |— sam-template.yml |— setup-sam.sh
ステップ 6: ワークフローを作成して実行する
このステップでは、Lambda ソースコードをパッケージ化し、デプロイするワークフローを作成します。ワークフローは、連続して実行される次の構成要素で構成されます。
-
トリガー – このトリガーは、ソースリポジトリに変更をプッシュすると、ワークフローを自動的に開始します。トリガーについての詳細は、「トリガーを使用したワークフロー実行の自動的な開始」を参照してください。
-
テストアクション (
Test
) – トリガー時に、このアクションは [Node パッケージマネージャー (npm)]をインストールし、 npm run test
コマンドを実行します。このコマンドは、package.json
ファイルで定義されたtest
スクリプトを実行するように npm に指示します。次に、test
スクリプトはユニットテストを実行し、テストレポート (junit.xml
) とコードカバレッジレポート (clover.xml
) の 2 つのレポートを生成します。詳細については、「package.json ファイル」を参照してください。次に、テストアクションは XML レポートを CodeCatalyst レポートに変換し、テストアクションの [Reports] タブの CodeCatalyst コンソールに表示します。
テストアクションの詳細については、「ワークフローを使用したテスト」を参照してください。
-
ビルドアクション (
BuildBackend
) – テストアクションが完了すると、ビルドアクションは AWS SAM CLI をダウンロードしてインストールし、hello-world
ソースをパッケージ化し、パッケージを Lambda サービスが想定する Amazon S3 バケットにコピーします。このアクションは、「sam-template-packaged.yml
」という名前の新しい AWS SAM テンプレートファイルも出力し、「buildArtifact
」という名前の出力アーティファクトに配置します。ビルドアクションの詳細については、「ワークフローを使用したビルド」を参照してください。
-
デプロイアクション (
DeployCloudFormationStack
) – ビルドアクションが完了すると、デプロイアクションはビルドアクション (buildArtifact
) によって生成された出力アーティファクトを検索し、その内部の AWS SAM テンプレートを見つけます。次に、テンプレートを実行します。AWS SAM テンプレートは、サーバーレスアプリケーションをデプロイするスタックを作成します。
ワークフローを作成するには
-
ナビゲーションペインで [CI/CD]、[ワークフロー] の順に選択します。
-
[ワークフローを作成] を選択します。
-
[ソースリポジトリ] で、
codecatalyst-cfn-source-repository
を選択します。 -
[ブランチ] で、
main
を選択します。 -
[Create] (作成) を選択します。
-
YAML サンプルコードを削除します。
-
次の YAML コードを追加します。
注記
次の YAML コードでは、必要に応じて
Connections:
セクションを省略できます。このセクションを省略する場合は、環境の [デフォルト IAM ロール] フィールドで指定されたロールに、ステップ 2: AWS ロールを作成する で記述されている両方のロールのアクセス許可と信頼ポリシーが含まれていることを確認する必要があります。デフォルトの IAM ロールを使用して環境を設定する方法の詳細については、「環境を作成する」を参照してください。Name: codecatalyst-cfn-workflow SchemaVersion: 1.0 Triggers: - Type: PUSH Branches: - main Actions: Test: Identifier: aws/managed-test@v1 Inputs: Sources: - WorkflowSource Outputs: Reports: CoverageReport: Format: CLOVERXML IncludePaths: - "coverage/*" TestReport: Format: JUNITXML IncludePaths: - junit.xml Configuration: Steps: - Run: npm install - Run: npm run test BuildBackend: Identifier: aws/build@v1 DependsOn: - Test Environment: Name:
codecatalyst-cfn-environment
Connections: - Name:codecatalyst-account-connection
Role:codecatalyst-build-role
Inputs: Sources: - WorkflowSource Configuration: Steps: - Run: . ./setup-sam.sh - Run: sam package --template-file sam-template.yml --s3-bucketcodecatalyst-cfn-s3-bucket
--output-template-file sam-template-packaged.yml --regionus-west-2
Outputs: Artifacts: - Name: buildArtifact Files: - "**/*" DeployCloudFormationStack: Identifier: aws/cfn-deploy@v1 DependsOn: - BuildBackend Environment: Name:codecatalyst-cfn-environment
Connections: - Name:codecatalyst-account-connection
Role:codecatalyst-deploy-role
Inputs: Artifacts: - buildArtifact Sources: [] Configuration: name: codecatalyst-cfn-stack region:us-west-2
role-arn:arn:aws:iam::111122223333:role/StackRole
template: ./sam-template-packaged.yml capabilities: CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND上記のコードで置き換えます。
-
環境の名前を持つ
[codecatalyst-cfn-environment]
の両方のインスタンス。 -
アカウント接続の表示名を持つ
[codecatalyst-account-connection]
の両方のインスタンス。表示名は数値である場合があります。詳細については、「ステップ 3: CodeCatalyst に AWS ロールを追加する」を参照してください。 -
ステップ 2: AWS ロールを作成する で作成したビルドロールの名前を持つ「
codecatalyst-build-role
」 -
ステップ 4: Amazon S3 バケットを作成する で作成した Amazon S3 バケットの名前を持つ
[codecatalyst-cfn-s3-bucket]
。 -
Amazon S3 バケットが存在するリージョン (1 番目のインスタンス) とスタックがデプロイされるリージョン (2 番目のインスタンス) を持つ
[us-west-2]
のインスタンスの両方。これらのリージョンは異なる場合があります。このチュートリアルでは、両方のリージョンがus-west-2
に設定されていることを前提としています。Amazon S3 と AWS CloudFormation でサポートされているリージョンの詳細については、「AWS 全般のリファレンス」の「サービスエンドポイントとクォータ」を参照してください。 -
ステップ 2: AWS ロールを作成する で作成したデプロイロールの名前を持つ「
codecatalyst-deploy-role
」 -
「前提条件」で作成した環境の名前を持つ
[codecatalyst-cfn-environment]
。 -
ステップ 2: AWS ロールを作成する で作成したスタックロールの Amazon リソースネーム (ARN) を持つ
[arn:aws:iam::111122223333:role/StackRole]
。注記
ビルド、デプロイ、スタックロールを作成しない場合、
codecatalyst-build-role
、codecatalyst-deploy-role
、およびarn:aws:iam::111122223333:role/StackRole
をCodeCatalystWorkflowDevelopmentRole-
ロールの名前または ARN に置き換えます。このロールの詳細については、「ステップ 2: AWS ロールを作成する」を参照してください。spaceName
前述のコードのプロパティの詳細については、「「AWS CloudFormation スタックをデプロイ」アクション YAML」を参照してください。
-
-
(オプション) [検証] を選択して、コミットする前に YAML コードが有効であることを確認します。
-
[Commit] (コミット) を選択します。
-
[ワークフローをコミット] ダイアログボックスで、次のように入力します。
-
[ワークフローファイル名] の場合、デフォルトの「
codecatalyst-cfn-workflow
」のままにします。 -
[コミットメッセージ] には、次のように入力します。
add initial workflow file
-
[リポジトリ] で、[codecatalyst-cfn-source-repository] を選択します。
-
[ブランチ名] で、[main] を選択します。
-
[Commit] (コミット) を選択します。
これでワークフローが作成されました。ワークフローの先頭で定義されているトリガーにより、ワークフローの実行が自動的に開始されます。具体的には、
codecatalyst-cfn-workflow.yaml
ファイルをソースリポジトリにコミット (およびプッシュ) すると、トリガーによってワークフローの実行が開始します。 -
ワークフロー実行の進行状況を確認するには
-
ナビゲーションペインで [CI/CD]、[ワークフロー] の順に選択します。
-
先ほど作成したワークフロー「
codecatalyst-cfn-workflow
」を選択します。 -
[実行] タブを選択します。
-
[Run ID] 列で、実行 ID を選択します。
-
[Test] を選択して、テストの進行状況を確認します。
-
[BuildBackend] を選択すると、ビルドの進行状況が表示されます。
-
[DeployCloudFormationStack] を選択してデプロイの進行状況を確認します。
実行の詳細を表示する方法については、「ワークフロー実行のステータスと詳細の表示」を参照してください。
-
[DeployCloudFormationStack] アクションが完了したら、以下を実行します。
-
ワークフローの実行が成功したら、次の手順に進みます。
-
[Test] または [BuildBackend] ワークフローの実行が失敗した場合は、[Logs] を選択して問題をトラブルシューティングします。
-
[DeployCloudFormationStack] アクションでワークフローの実行が失敗した場合は、デプロイアクションを選択し、[概要] タブを選択します。[CloudFormation イベント] セクションにスクロールして、詳細なエラーメッセージを表示します。ロールバックが発生した場合は、ワークフローを再実行する前に、AWS の AWS CloudFormation コンソールから
codecatalyst-cfn-stack
スタックを削除します。
-
デプロイを確認するには
-
デプロイが成功したら、上部付近の水平メニューバーから [変数 (7)] を選択します。(右側のペインで [変数] を選択しないでください)。
-
[HelloWorldApi] の横にある
https://
URL をブラウザに貼り付けます。Lambda 関数からの [hello world] JSON メッセージが表示され、ワークフローが Lambda 関数と API Gateway を正常にデプロイおよび設定したことを示します。
ヒント
CodeCatalyst が、いくつかの細かい設定を持つワークフロー図に、この URL を表示するようにできます。詳細については、「ワークフロー図でのアプリケーション URL の表示」を参照してください。
ユニットテスト結果とコードカバレッジを検証するには
-
ワークフロー図で、[Test] を選択し、[Reports] を選択します。
-
[TestReport] を選択してユニットテスト結果を表示するか、[CoverageReport] を選択してテスト対象のファイルのコードカバレッジの詳細を表示します。この場合、
app.js
とtest-handler.js
です。
デプロイされたリソースを確認するには
AWS Management Console にサインインし、API Gateway コンソール https://console.aws.amazon.com/apigateway/
を開きます。 -
AWS SAM テンプレートが作成した [codecatalyst-cfn-stack] API を確認します。API 名は、ワークフロー定義ファイル (
codecatalyst-cfn-workflow.yaml
) のConfiguration/name
の値から取得します。 AWS Lambda コンソールを (https://console.aws.amazon.com/lambda/
) 開きます。 -
ナビゲーションペインで、[Functions] (関数) を選択します。
-
Lambda 関数「
codecatalyst-cfn-stack-HelloWorldFunction-
」を選択します。string
-
API Gateway が 関数のトリガーであることを確認できます。この統合は、AWS SAM
AWS::Serverless::Function
リソースタイプによって自動的に設定されました。
ステップ 7: 変更を行う
このステップでは、Lambda ソースコードを変更してコミットします。このコミットにより、新しいワークフロー実行が開始します。この実行では、Lambda コンソールで指定されたデフォルトのトラフィックシフト設定を使用するブルーグリーンスキームで新しい Lambda 関数をデプロイします。
Lambda ソースを変更するには
-
CodeCatalyst で、プロジェクトに移動します。
-
ナビゲーションペインで [コード] を選択してから、[ソースリポジトリ] を選択します。
-
ソースリポジトリ「
codecatalyst-cfn-source-repository
」を選択します。 -
アプリケーションファイルを変更します。
-
hello-world
フォルダを選択します。 -
app.js
ファイルを選択します。 -
[編集] を選択します。
-
行 23 において、
hello world
をTutorial complete!
に変更します。 -
[コミット] を選択し、再度 [コミット] を選択します。
コミットにより、ワークフローの実行が開始します。名前の変更を反映するようにユニットテストを更新していないため、この実行は失敗します。
-
-
ユニットテストを更新します。
-
[
hello-world\tests\unit\test-handler.js
] を選択します。 -
[編集] を選択します。
-
行 19 において、
hello world
をTutorial complete!
に変更します。 -
[コミット] を選択し、再度 [コミット] を選択します。
コミットにより、もう 1 つのワークフローの実行が開始します。この実行は成功します。
-
-
ナビゲーションペインで [CI/CD]、[ワークフロー] の順に選択します。
-
[
codecatalyst-cfn-workflow
] を選択し、[実行] を選択します。 -
最新の実行の実行 ID を選択します。この時点では実行中です。
-
[Test]、[BuildBackend]、[DeployCloudFormationStack] を選択し、ワークフローの実行の進行状況を確認します。
-
ワークフローが完了したら、上部の近くの [変数 (7)] を選択します。
-
[HelloWorldApi] の横にある
https://
URL をブラウザに貼り付けます。Tutorial complete!
メッセージがブラウザに表示されます。これは、アプリケーションが正常にデプロイされたことを示しています。
クリーンアップ
このチュートリアルで使用されているファイルとサービスをクリーンアップして、料金が発生しないようにします。
CodeCatalyst コンソールでクリーンアップするには
https://codecatalyst.aws/
で CodeCatalyst コンソールを開きます。 -
codecatalyst-cfn-workflow
を削除します。 -
codecatalyst-cfn-environment
を削除します。 -
codecatalyst-cfn-source-repository
を削除します。 -
codecatalyst-cfn-project
を削除します。
AWS Management Console をクリーンアップするには
-
CloudFormation で次のようにクリーンアップします。
https://console.aws.amazon.com/cloudformation
で AWS CloudFormation コンソール を開きます。 -
codecatalyst-cfn-stack
を削除します。スタックを削除すると、API Gateway および Lambda サービスからすべてのチュートリアルリソースが削除されます。
-
Amazon S3 で次のようにクリーンアップします。
https://console.aws.amazon.com/s3/
で Amazon S3 コンソールを開きます。 -
[
codecatalyst-cfn-s3-bucket
] を選択します。 -
バケットのコンテンツを削除します。
-
バケットを削除します。
-
IAM で次のようにクリーンアップします。
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
codecatalyst-deploy-policy
を削除します。 -
codecatalyst-build-policy
を削除します。 -
codecatalyst-stack-policy
を削除します。 -
codecatalyst-deploy-role
を削除します。 -
codecatalyst-build-role
を削除します。 -
codecatalyst-stack-role
を削除します。
このチュートリアルでは、CodeCatalyst ワークフローと [AWS CloudFormation スタック] アクションを使用してサーバーレスアプリケーションを CloudFormation スタックとしてデプロイする方法について説明します。