「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
チュートリアル: Hello World アプリケーションのデプロイ
このガイドでは、AWS SAM を使用してサンプルの Hello World アプリケーションをダウンロード、構築、およびデプロイします。次に、アプリケーションを AWS クラウドでテストし、必要に応じて開発ホストでローカルにテストします。
このアプリケーションは、基本的な API バックエンドを実装します。エンドポイントと Amazon API Gateway 関数で構成されます。AWS LambdaAPI
Gateway エンドポイントに GET リクエストを送信すると、Lambda 関数が呼び出されます。この関数は、hello world
メッセージを返します。
次の図は、このアプリケーションのコンポーネントを示しています。

サンプルアプリケーションを初期化するときは、Lambda デプロイパッケージタイプ (Zip
または Image
) を選択するオプションがあります。 パッケージタイプの詳細については、Lambda の「 デプロイパッケージAWS Lambda Developer Guide」を参照してください。
以下は、Hello World アプリケーションを作成するために実行するコマンドのプレビューです。これらの各コマンドの詳細については、このチュートリアルの後半のセクションを参照してください。
#Step 1 - Download a sample application
sam init
#Step 2 - Build your applicationcd sam-app
sam build
#Step 3 - Deploy your applicationsam deploy --guided
Prerequisites
このガイドでは、「AWS SAM CLI のインストール」のオペレーティングシステムに関する以下のステップを完了していることを前提としています。
-
アカウントの作成。AWS
-
(AWS Identity and Access Management) アクセス許可の設定。IAM
-
Docker のインストール。注意: Docker は、アプリケーションをローカルでテストするための前提条件です。
-
Homebrew をインストールします。注意: Homebrew は、Linux と macOS の場合の前提条件です。
-
コマンドラインインターフェイス(CLI)のインストールAWS SAM 注意: バージョン 1.13.0 以降を使用していることを確認します。コマンドを実行してバージョンを確認します。
sam --version
-
パッケージタイプを選択した場合、デプロイを実行するための
Image
(Amazon Elastic Container Registry) リポジトリ URI が必要です。Amazon ECR
ステップ 1: サンプル AWS SAM アプリケーションをダウンロードする
実行するコマンド:
sam init
画面に表示される指示に従ってください。このチュートリアルでは、[AWS
Quick Start Templates
]、[Zip
] パッケージタイプ、選択したランタイム、および [Hello World Example
] を選択することをお勧めします。
出力例:
----------------------- Generating application: ----------------------- Name: sam-app Runtime: python3.7 Dependency Manager: pip Application Template: hello-world Output Directory: . Next steps can be found in the README file at ./sam-app/README.md
AWS SAM で実行される処理:
このコマンドは、プロジェクト名として指定した名前のディレクトリを作成します。プロジェクトディレクトリの内容は以下のようになります。
sam-app/ ├── README.md ├── events/ │ └── event.json ├── hello_world/ │ ├── __init__.py │ ├── app.py #Contains your AWS Lambda handler logic. │ └── requirements.txt #Contains any Python dependencies the application requires, used for sam build ├── template.yaml #Contains the AWS SAM template defining your application's AWS resources. └── tests/ └── unit/ ├── __init__.py └── test_handler.py
これらのプロジェクトディレクトリの内容は、Python ランタイムのいずれかと Hello World Example
を選択すると作成されます。
以下の 3 つのファイルは特に重要です。
-
template.yaml
: アプリケーションの AWS SAM リソースを定義する AWS テンプレートが含まれます。 -
hello_world/app.py
: 実際の Lambda ハンドラロジックが含まれます。 -
hello_world/requirements.txt
: アプリケーションが必要とするすべての Python 依存関係が含まれ、sam build
に使用されます。
ステップ 2: アプリケーションの構築
実行するコマンド:
まず、プロジェクトディレクトリに移動し、サンプルアプリケーションの template.yaml
ファイルを配置します。(デフォルトでは、このディレクトリは sam-app
です)。 次に、以下のコマンドを実行します。
sam build
出力例:
Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Invoke Function: sam local invoke [*] Deploy: sam deploy --guided
AWS SAM で実行される処理:
AWS SAM CLI には、依存関係を構築するための Lambda ランタイムの抽象化が多数含まれており、ソースコードをステージングフォルダにコピーして、すべてをパッケージ化してデプロイできるようにします。sam build
コマンドでは、アプリケーションが持つ依存関係を構築し、アプリケーションのソースコードを .aws-sam/build
の下のフォルダにコピーして圧縮し、Lambda にアップロードします。
次の最上位のツリーが .aws-sam
の下に表示されます。
.aws_sam/ └── build/ ├── HelloWorldFunction/ └── template.yaml
HelloWorldFunction
は、app.py
ファイルと、アプリケーションで使用するサードパーティーの依存関係を含むディレクトリです。
ステップ 3: アプリケーションを AWS クラウドにデプロイする
実行するコマンド:
sam deploy --guided
画面に表示される指示に従ってください。インタラクティブな形式で提供されるデフォルトのオプションを受け入れるには、Enter
で応答します。 サンプルアプリケーションをダウンロードしたときに Image
パッケージタイプを選択した場合は、Amazon ECR リポジトリの入力を求められます。サーバーレスアプリケーションをデプロイするには、有効な Amazon ECR
リポジトリ URI を指定します。
プロンプト HelloWorldFunction may not have authorization defined, Is
this okay? [y/N]
について、AWS SAM は、サンプルアプリケーションが認証なしで API Gateway API を設定することを知らせます。サンプルアプリケーションをデプロイすると、AWS
SAM によって公開されている URL が作成されます。
この通知を確認するには、プロンプトに対して「Y」と応答します。認証の設定の詳細については、「へのアクセスの制御API GatewayAPIs」を参照してください。
出力例:
Deploying with following values
===============================
Stack name : sam-app
Region : us-east-1
Confirm changeset : False
Deployment s3 bucket : sam-bucket
Capabilities : ["CAPABILITY_IAM"]
Parameter overrides : {}
Initiating deployment
=====================
Waiting for changeset to be created..
CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType
---------------------------------------------------------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionHelloWorldPermissionProd AWS::Lambda::Permission
+ Add ServerlessRestApiDeployment47fc2d5f9d AWS::ApiGateway::Deployment
+ Add ServerlessRestApiProdStage AWS::ApiGateway::Stage
+ Add ServerlessRestApi AWS::ApiGateway::RestApi
* Modify HelloWorldFunctionRole AWS::IAM::Role
* Modify HelloWorldFunction AWS::Lambda::Function
---------------------------------------------------------------------------------------------------------------------------------------------------
2019-11-21 14:33:24 - Waiting for stack create/update to complete
CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
UPDATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
UPDATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 Resource creation Initiated
f9d
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis Resource creation Initiated
sionProd
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis -
sionProd
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 -
f9d
CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 -
f9d
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis -
sionProd
UPDATE_COMPLETE_CLEANUP_IN_PROGRES AWS::CloudFormation::Stack sam-app -
S
UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app -
-------------------------------------------------------------------------------------------------------------------------------------------------
Stack sam-app outputs:
---------------------------------------------------------------------------------------------------------------------------------------------------
OutputKey-Description OutputValue
---------------------------------------------------------------------------------------------------------------------------------------------------
HelloWorldFunctionIamRole - Implicit IAM Role created for Hello World arn:aws:iam::123456789012:role/sam-app-
function HelloWorldFunctionRole-104VTJ0TST7M0
HelloWorldApi - API Gateway endpoint URL for Prod stage for Hello World https://0ks2zue0zh.execute-api.us-east-1.amazonaws.com/Prod/hello/
function
HelloWorldFunction - Hello World Lambda Function ARN arn:aws:lambda:us-east-1:123456789012:function:sam-app-
HelloWorldFunction-1TY92MJX0BXU5
---------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-app in us-east-1
AWS SAM で実行される処理:
このコマンドは、アプリケーションを AWS クラウドにデプロイします。コマンドで構築したデプロイアーティファクトを取得し、パッケージ化して、sam build
CLI が作成する Amazon Simple Storage Service (Amazon S3) バケットにアップロードします。その後、AWS SAM を使用してアプリケーションをデプロイします。AWS
CloudFormationコマンドの出力では、sam deploy
スタックに加えられた変更を確認できます。AWS CloudFormation
アプリケーションで HTTP エンドポイントを作成した場合、sam deploy
が生成する出力には、テストアプリケーションのエンドポイント URL も表示されます。curl
を使用すると、そのエンドポイント URL を使用してアプリケーションにリクエストを送信できます。次に例を示します。
curl
https://<restapiid>.execute-api.us-east-1.amazonaws.com/Prod/hello/
アプリケーションを正常にデプロイすると、次のような出力が表示されます。
{"message": "hello world"}
コマンドの実行後に {"message": "hello world"}
が表示された場合、サーバーレスアプリケーションを curl
に正常にデプロイ済みであり、ライブ AWS 関数を呼び出しています。Lambda表示されない場合は、このチュートリアルの後半にある「Troubleshooting」セクションを参照してください。
ステップ 4: (オプション) アプリケーションをローカルでテストする
アプリケーションを開発しているときは、ローカルでテストすると便利です。AWS SAM CLI には、Docker コンテナを使用してアプリケーションを実行する sam local
コマンドが用意されており、Lambda の実行環境をシミュレートできます。これには、次の 2 つのオプションがあります。
-
API をローカルでホストする
-
関数を直接呼び出すLambda
このステップでは、両方のオプションについて説明します。
API をローカルでホストする
実行するコマンド:
sam local start-api
出力例:
2019-07-12 15:27:58 Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET] 2019-07-12 15:27:58 You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template 2019-07-12 15:27:58 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit) Fetching lambci/lambda:python3.7 Docker container image...................................................................................................................................................................................... 2019-07-12 15:28:56 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Duration: 4.42 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 22 MB 2019-07-12 15:28:58 No Content-Type given. Defaulting to 'application/json'. 2019-07-12 15:28:58 127.0.0.1 - - [12/Jul/2019 15:28:58] "GET /hello HTTP/1.1" 200 -
Docker イメージが読み込まれるまでに時間がかかる場合があります。読み込まれたら、curl
を使用して、ローカルホストで実行されているアプリケーションにリクエストを送信できます。
curl http://127.0.0.1:3000/hello
出力例:
2019-07-12 15:29:57 Invoking app.lambda_handler (python3.7) 2019-07-12 15:29:57 Found credentials in shared credentials file: ~/.aws/credentials Fetching lambci/lambda:python3.7 Docker container image...... 2019-07-12 15:29:58 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Duration: 7.92 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 22 MB {"statusCode":200,"body":"{\"message\": \"hello world\"}"}
AWS SAM で実行される処理:
start-api
コマンドは、REST API エンドポイントをレプリケートするローカルエンドポイントを起動します。関数をローカルで実行できる実行コンテナをダウンロードします。最終的な結果は、AWS
クラウドで関数を呼び出したときと同じ出力になります。
関数を直接呼び出すLambda
実行するコマンド:
sam local invoke "HelloWorldFunction" -e events/event.json
出力例:
2019-07-01 14:08:42 Found credentials in shared credentials file: ~/.aws/credentials 2019-07-01 14:08:42 Invoking app.lambda_handler (python3.7) Fetching lambci/lambda:python3.7 Docker container image............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 2019-07-01 14:09:39 Mounting /<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container START RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Version: $LATEST END RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 REPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72 Duration: 3.51 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 22 MB {"statusCode":200,"body":"{\"message\": \"hello world\"}"}
AWS SAM で実行される処理:
invoke
コマンドは Lambda 関数を直接呼び出し、指定した入力イベントペイロードを渡すことができます。このコマンドでは、サンプルアプリケーションが提供するファイル event.json
にイベントペイロードを渡します。
初期化したアプリケーションには、aws-proxy
のデフォルトの API Gateway イベントが付属しています。いくつかの値が事前に入力されています。この場合、HelloWorldFunction
は特定の値を認識しないため、スタブされたリクエストは OK になります。実際のリクエストに期待するものをシミュレートするために、リクエストに代入する値をいくつか指定できます。以下は、独自の入力イベントを生成し、出力をデフォルトの
event.json
オブジェクトと比較する例です。
sam local generate-event apigateway aws-proxy --body "" --path "hello" --method GET > api-event.json diff api-event.json event.json
出力例:
< "body": "",
---
> "body": "{\"message\": \"hello world\"}",
4,6c4,6
< "path": "/hello",
< "httpMethod": "GET",
< "isBase64Encoded": true,
---
> "path": "/path/to/resource",
> "httpMethod": "POST",
> "isBase64Encoded": false,
11c11
< "proxy": "/hello"
---
> "proxy": "/path/to/resource"
56c56
< "path": "/prod/hello",
---
> "path": "/prod/path/to/resource",
58c58
< "httpMethod": "GET",
---
> "httpMethod": "POST",
Troubleshooting
AWS SAM CLI エラー: 「セキュリティの制約が満たされない」
を実行すると、sam deploy --guided
という質問が表示されます。HelloWorldFunction may not have authorization defined, Is this okay? [y/N]
このプロンプトに「N」(デフォルトのレスポンス) で応答すると、次のエラーが表示されます。
Error: Security Constraints Not Satisfied
このプロンプトで、デプロイしようとしているアプリケーションでは、承認なしで API Gateway API が設定されている可能性があることがわかります。このプロンプトに「N」と応答すると (デフォルト)、これは問題ありません。
この問題を修正するには、次のオプションがあります。
-
許可を使用してアプリケーションを設定します。認証の設定の詳細については、「へのアクセスの制御API GatewayAPIs」を参照してください。
-
API が承認なしで設定されているアプリケーションをデプロイしても問題がないことを示すため、この質問には「Y」で応答します。API Gateway
AWS SAM CLI エラー: "no such option: --app-template"
sam init
を実行すると、次のエラーが表示されます。
Error: no such option: --app-template
これは、--app-template
パラメータをサポートしていない古いバージョンの AWS SAM CLI を使用していることを意味します。この問題を解決するには、AWS SAM CLI のバージョンを
0.33.0 以降に更新するか、sam init
コマンドから --app-template
パラメータを削除します。
AWS SAM CLI エラー: "no such option: --guided"
sam deploy
を実行すると、次のエラーが表示されます。
Error: no such option: --guided
これは、--guided
パラメータをサポートしていない古いバージョンの AWS SAM CLI を使用していることを意味します。この問題を解決するには、AWS SAM CLI のバージョンを
0.33.0 以降に更新するか、sam deploy
コマンドから --guided
パラメータを削除します。
AWS SAM CLI エラー: "マネージドリソースを作成できませんでした: 認証情報が見つからない」
sam deploy
を実行すると、次のエラーが表示されます。
Error: Failed to create managed resources: Unable to locate credentials
これは、AWS CLI が AWS SAM サービス呼び出しを実行できるように AWS 認証情報を設定していないことを意味します。これを修正するには、AWS 認証情報をセットアップする必要があります。詳細については、「AWS認証情報の設定」を参照してください。
AWS SAM CLI エラー: "AWS SAM プロジェクトをローカルで実行するには、Docker が必要です。このファイルをインストールしましたか?」というメッセージが表示されます。
sam local start-api
を実行すると、次のエラーが表示されます。
Error: Running AWS SAM projects locally requires Docker. Have you got it installed?
これは、Docker が正しくインストールされていないことを意味します。Docker は、アプリケーションをローカルでテストするために必要です。これを修正するには、開発ホストの Docker をインストールする手順に従います。に移動し、適切なプラットフォームを選択して、[AWS SAM CLI のインストールDocker のインストール] というセクションの手順に従います。
Curl エラー: 「認証トークンが見つかりません」
API Gateway エンドポイントを呼び出すと、次のエラーが表示されます。
{"message":"Missing Authentication Token"}
これは、正しいドメインにリクエストを送信しようとしたものの、URI で認識できないことを意味します。この問題を解決するには、完全な URL を確認し、正しい URL
で curl
コマンドを更新します。
Curl エラー: "curl: (6) 解決できませんでした: ..."
API Gateway エンドポイントを呼び出すと、次のエラーが表示されます。
curl: (6) Could not resolve: endpointdomain
(Domain name not found)
これは、無効なドメインにリクエストを送信しようとしたことを意味します。これは、サーバーレスアプリケーションが正常にデプロイできなかった場合、または curl
コマンドにタイプミスがある場合に発生します。コンソールまたは AWS CloudFormation を使用して、アプリケーションが正常にデプロイされたことを確認し、AWS
CLI コマンドが正しいことを確認します。curl
クリーンアップ
このチュートリアルを実行して作成した AWS リソースが不要になった場合は、デプロイした AWS CloudFormation スタックを削除することでリソースを削除できます。
を使用して AWS CloudFormation スタックを削除するには、次の手順を実行します。AWS マネジメントコンソール
-
AWS マネジメントコンソール にサインインして、https://console.aws.amazon.com/cloudformation
で AWS CloudFormation コンソールを開きます。 -
左のナビゲーションペインで [スタック] を選択します。
-
スタックのリストで、[sam-app] (または作成したスタックの名前) を選択します。
-
[削除] を選択します。
完了すると、スタックのステータスが DELETE_COMPLETE に変わります。
または、次の AWS CloudFormation コマンドを実行して AWS CLI スタックを削除することもできます。
aws cloudformation delete-stack --stack-name
sam-app
--regionregion
削除されたスタックの確認
どちらの方法でも AWS CloudFormation スタックを削除する場合は、AWS CloudFormation コンソール
Conclusion
このチュートリアルでは、以下の作業を行いました。
-
を使用して、サーバーレスアプリケーションを作成、構築し、AWS にデプロイする。AWS SAM
-
CLI および Docker を使用してアプリケーションをローカルでテストする。AWS SAM
-
不要になった AWS リソースを削除する。
次のステップ
これで、AWS SAM CLI を使用して独自のアプリケーションの構築を開始する準備が整いました。
開始しやすくするために、 の AWS Serverless Application Repository のサンプル