チュートリアル: Hello World アプリケーションのデプロイ - AWS Serverless Application Model

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

チュートリアル: Hello World アプリケーションのデプロイ

このガイドでは、AWS SAM を使用してサンプルの Hello World アプリケーションをダウンロード、構築、およびデプロイします。次に、 AWS クラウドでアプリケーションをテストし、必要に応じて開発ホストでローカルにテストします。

このアプリケーションは、基本的な API バックエンドを実装します。Amazon API Gateway エンドポイントと AWS Lambda 関数で構成されます。API Gateway エンドポイントに GET リクエストを送信すると、Lambda 関数が呼び出されます。この関数は、hello world メッセージを返します。

次の図は、このアプリケーションのコンポーネントを示しています。


      Lambda エンドポイントに GET リクエストを送信するときに呼び出される API Gateway 関数の図。

サンプルアプリケーションを初期化するときはLambda、デプロイパッケージのタイプ ( Zip または ) を選択できますImage。パッケージタイプの詳細については、の「Lambdaデプロイパッケージ」を参照してくださいAWS Lambda Developer Guide

以下は、Hello World アプリケーションを作成するために実行するコマンドのプレビューです。これらの各コマンドの詳細については、このチュートリアルで後述するセクションを参照してください。

#Step 1 - Download a sample application sam init #Step 2 - Build your application cd sam-app sam build #Step 3 - Deploy your application sam deploy --guided

Prerequisites

このガイドでは、 AWS SAM CLI のインストールでオペレーティングシステムのステップを完了したことを前提としています。

  1. AWS アカウントの作成。

  2. AWS Identity and Access Management (IAM) アクセス許可の設定。

  3. Docker のインストール。注意: Docker は、アプリケーションをローカルでテストするための前提条件です。

  4. Homebrew のインストール。注意: Homebrew は Linux および macOS の前提条件です。

  5. AWS SAM コマンドラインインターフェイス (CLI) のインストール。注意: バージョン 1.13.0 以降であることを確認します。sam --version コマンドを実行してバージョンを確認します。

  6. Image パッケージタイプを選択した場合、デプロイを実行する Amazon Elastic Container Registry (Amazon ECR) リポジトリ URI を持つ。

ステップ 1: サンプルAWS SAMアプリケーションをダウンロードする

実行するコマンド:

sam init

画面に表示される指示に従ってください。このチュートリアルではAWS Quick Start TemplatesZip、、パッケージタイプ、選択したランタイム、および を選択することをお勧めします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 を認証API Gatewayなしで設定したことを通知しています。サンプルアプリケーションをデプロイすると、 によって公開されている URL AWS SAM が作成されます。

プロンプトに「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 コマンドで構築したデプロイアーティファクトを取得しAmazon Simple Storage Service、それらをパッケージ化して CLI が作成する 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 events/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
            

これは、AWS SAM パラメータをサポートしていない古いバージョンの --app-template CLI を使用していることを意味します。この問題を解決するには、AWS SAM CLI のバージョンを 0.33.0 以降に更新するか、--app-template コマンドから sam init パラメータを削除します。

AWS SAM CLI エラー: "no such option: --guided"

sam deploy を実行すると、次のエラーが表示されます。

 
Error: no such option: --guided
            

これは、AWS SAM パラメータをサポートしていない古いバージョンの --guided CLI を使用していることを意味します。この問題を解決するには、AWS SAM CLI のバージョンを 0.33.0 以降に更新するか、--guided コマンドから sam deploy パラメータを削除します。

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 のインストール、適切なプラットフォームを選択して、[Install Docker (Docker のインストール)] というセクションの手順に従います。

Curl エラー: 「認証トークンが見つかりません」

API Gateway エンドポイントを呼び出すと、次のエラーが表示されます。

 
 {"message":"Missing Authentication Token"}
            

これは、正しいドメインにリクエストを送信しようとしたものの、URI で認識できないことを意味します。この問題を解決するには、完全な URL を確認し、正しい URL で curl コマンドを更新します。

Curl エラー: "curl: (6) Could not resolve: ..."

API Gateway エンドポイントを呼び出すと、次のエラーが表示されます。

 
 curl: (6) Could not resolve: endpointdomain (Domain name not found)
            

これは、無効なドメインにリクエストを送信しようとしたことを意味します。これは、サーバーレスアプリケーションが正常にデプロイできなかった場合、または curl コマンドにタイプミスがある場合に発生します。AWS CloudFormation コンソールまたは を使用してアプリケーションが正常にデプロイされたことを確認しAWS CLI、curlコマンドが正しいことを確認します。

クリーンアップ

このチュートリアルを実行して作成したAWSリソースが不要になった場合は、デプロイした AWS CloudFormation スタックを削除して削除できます。

を使用してAWS CloudFormationスタックを削除するにはAWS マネジメントコンソール、次の手順に従います。

  1. AWS マネジメントコンソール にサインインして、https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソールを開きます。

  2. 左のナビゲーションペインで [スタック] を選択します。

  3. スタックのリストで、[sam-app] (または作成したスタックの名前) を選択します。

  4. [削除] を選択します。

完了すると、スタックのステータスが DELETE_COMPLETE に変わります。

または、AWS CloudFormation次のコマンドを実行してAWS CLIスタックを削除することもできます。

aws cloudformation delete-stack --stack-name sam-app --region region

削除されたスタックを確認する

AWS CloudFormation スタックを削除するどちらの方法でも、 AWS CloudFormation コンソールに移動してスタックが削除されたことを確認できます。左のナビゲーションペインで [Stacks] を選択し、検索ボックスの横にあるドロップダウンリストで [Deleted] を選択します。削除されたスタックのリストにスタックの名前が表示されます。

Conclusion

このチュートリアルでは、以下の作業を行いました。

  1. AWS を使用してサーバーレスアプリケーションを作成、構築、および にデプロイAWS SAMします。

  2. AWS SAM CLI および Docker を使用してアプリケーションをローカルでテストした。

  3. 不要になったAWSリソースを削除しました。

次のステップ

これで、AWS SAM CLI を使用して独自のアプリケーションの構築を開始する準備が整いました。

開始しやすくするためにGitHub の AWS Serverless Application Repository Examples リポジトリから任意のサンプルアプリケーションをダウンロードできます。