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

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

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

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

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

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


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

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

以下は、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

このガイドは、ご使用の OS のステップを「」で完了していることを前提としています。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 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 ランタイムの 1 つを選択し、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 SAMCLI には、依存関係を構築するための Lambda ランタイムの抽象化が多数含まれており、ソースコードをステージングフォルダにコピーして、すべてをパッケージ化してデプロイできるようにします。-sam buildコマンドは、アプリケーションが持つ依存関係を構築し、アプリケーションのソースコードを.aws-sam/buildを圧縮してLambda にアップロードします。

次の最上位のツリーが .aws-sam の下に表示されます。

 
 .aws-sam/
   └── build/
       ├── HelloWorldFunction/
       └── template.yaml
            

HelloWorldFunction は、app.py ファイルと、アプリケーションで使用するサードパーティーの依存関係を含むディレクトリです。

ステップ 3: アプリケーションをAWSCloud

実行するコマンド:

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 Gateway API へのアクセスの制御

出力例:

 
    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 (Amazon S3) バケットにアップロードします。AWS SAMCLI を使用して、アプリケーションを作成し、デプロイします。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 SAMCLI では、sam localLambda の実行環境をシミュレートする Docker コンテナを使用してアプリケーションを実行する。これには、次の 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-proxyAPI 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 SAMCLI エラー: 「セキュリティ制約が満たされていない」

実行時sam deploy --guided」と入力すると、HelloWorldFunction may not have authorization defined, Is this okay? [y/N]。このプロンプトにN(デフォルトの応答) では、次のエラーが表示されます。

 
Error: Security Constraints Not Satisfied
            

プロンプトは、デプロイしようとしているアプリケーションに、承認なしに Amazon API Gateway API が設定されている可能性があることを通知します。応答することによりNをこのプロンプトに追加すると、これはOKではないと言っています。

これを修正するには、次のオプションがあります。

  • 承認を使用してアプリケーションを設定します。認可の設定については、「」を参照してください。API Gateway API へのアクセスの制御

  • この質問にYをクリックして、許可なしに API Gateway API が設定されたアプリケーションをデプロイしても問題ないことを示します。

AWS SAMCLI エラー:「no sugh 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 SAMCLI エラー:「no sush option: —guided」

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

 
Error: no such option: --guided
            

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

AWS SAMCLI エラー: 「管理対象リソースを作成できませんでした: 認証情報を見つけることができません」

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

 
Error: Failed to create managed resources: Unable to locate credentials
            

これは、設定していないことを意味しますAWS認証情報を利用してAWS SAM作成する CLIAWSサービス呼び出しです。これを修正するには、AWS認証情報。詳細については、「のセットアップAWS認証情報」を参照してください。

AWS SAMCLI エラー: 「実行中AWSSAMプロジェクトはローカルで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 コマンドを更新します。

カールエラー:「カール:(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 Management Console以下の手順を実行します。

  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

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

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

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

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

または、AWS CloudFormationスタックを実行することで、AWS CLIコマンド:

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

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

どちらの方法でも、AWS CloudFormationスタックから削除されたことを確認するには、AWS CloudFormationconsole。左のナビゲーションペインで、スタック] をクリックし、検索ボックスの横にあるドロップダウンリストで、削除。削除されたスタックのリストに、スタックの名前が表示されます。

Conclusion

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

  1. サーバーレスアプリケーションを作成、構築し、デプロイするAWSを使用したAWS SAM。

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

  3. デバイスに保存されているAWS不要になったリソース。

次のステップ

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

開始しやすくなるように、サンプルアプリケーションをAWS Serverless Application Repository例GitHub のリポジトリ。