AWSのSAM(サーバレスアプリケーションモデル)についてまとめています。
AWSのSAMはサーバレスアプリケーション構築用のフレームワーク
AWSのSAM(Serverless Application Model)は、サーバレスアプリケーションを構築するためのオープンソースフレームワークです。
コマンドラインインタフェースを使って、関数、API、データベース、イベントソースマッピングを記述可能。リソースごとに数行で、任意のアプリケーションを定義し、 YAML を使ってモデリングができます。
また、SAM CLIを使うと、ローカル環境にLambdaに似た実行環境が提供され、コードのステップスルーやデバッグをおこない、AWS上で実行させる前に動作チェックが可能です。
SAM用のCLIには、Linux(CnetOS、Fedra、Ubuntu、Amazon Linux2)用、Windows用、Mac用が用意されています。
LinuxへのAWS SAM CLIのインストール
LinuxのAWS SAM CLIをインストールするには、以下の手順が必要です。
- AWSアカウントの作成。
- AWS Identity and Access Management(IAM)パーミッションとAWSクレデンシャルの設定。
- Dockerのンストール。(アプリケーションのローカルテストまたは、–use-container オプションを使用する場合にのみ)
AWS SAMCLIをインストールするには、Githubからインストーラー用zipをダウンロード後に展開し、sudoにて実行します。最後に、samコマンドを実行してバージョンが表示されれば、正常にインストールされていることになります。具体的なコマンドは以下の通りです。
$ wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip $ sha256sum aws-sam-cli-linux-x86_64.zip <64-character SHA256 hash value> aws-sam-cli-linux-x86_64.zip $ unzip aws-sam-cli-linux-x86_64.zip -d sam-installation $ sudo ./sam-installation/install $ sam --version SAM CLI, version 1.18.0
関連)LinuxへのAWSSAMCLIのインストール-AWSサーバーレスアプリケーションモデル
AWS SAM CLIの使い方
samコマンドの実際の使い方を見ていきましょう。
参考)チュートリアル:HelloWorldアプリケーションのデプロイ-AWSサーバーレスアプリケーションモデル
sam initでコマンドで、アプリケーションの初期化をおこないます。具体的には、プロジェクト名として指定した名前のディレクトリを作成します。
sam init ----------------------- アプリケーションの生成: ----------------------- 名前:sam-app ランタイム:python3.7 依存関係マネージャー:pip アプリケーションテンプレート:hello-world 出力ディレクトリ: 。 次の手順は、。/ sam-app /README.mdのREADMEファイルにあります。
sam buildで、アプリケーションのビルドをおこないます。デプロイの準備のために、ソースコードをステージングフォルダにコピーします。
sam build ビルドが成功しました ビルドされたアーティファクト:.aws-sam / build ビルドされたテンプレート:.aws-sam / build / template.yaml 次に使用できるコマンド ========================= [*] Invoke関数:sam local invoke [*]デプロイ:sam deploy --guided
sam deployで、アプリケーションのデプロイをおこないます。ビルドしたデプロイアーティファクトを取得、パッケージ化してAmazon S3パケットにアップロードして、AWS CloudFormationを使ってアプリケーションをデプロイします。
sam deploy --guided 次の値でデプロイする =============================== スタック名:sam-app 地域:us-east-1 チェンジセットの確認:False デプロイs3バケット:sam-bucket 機能:["CAPABILITY_IAM"] パラメータのオーバーライド:{ } 展開の開始 ===================== チェンジセットが作成されるのを待っています。 CloudFormationスタックチェンジセット --------------------------------------------------------------------------------------------------------------------------------------------------- 操作LogicalResourceIdResourceType --------------------------------------------------------------------------------------------------------------------------------------------------- + HelloWorldFunctionHelloWorldPermissionProd AWS :: Lambda :: Permissionを追加します + ServerlessRestApiDeployment47fc2d5f9d AWS :: ApiGateway :: Deploymentを追加します + ServerlessRestApiProdStage AWS :: ApiGateway :: Stageを追加します
sam local start-apiにて、ローカル環境でアプリケーションを実行します。関数をローカルで実行できる実行コンテナをダウンロードし、実行します。
sam local start-api 2019-07-12 15:27:58 http://127.0.0.1:3000/helloでHelloWorldFunctionをマウント[GET] 2019-07-12 15:27:58これで、上記のエンドポイントを参照して関数を呼び出すことができます。機能の作業中にSAMCLIを再起動/再ロードする必要はありません。変更は即座に/自動的に反映されます。AWS SAMテンプレートを更新する場合にのみ、SAMCLIを再起動する必要があります 2019-07-12 15:27:58 * http://127.0.0.1:3000/で実行中(CTRL + Cを押して終了) lambci / lambda:python3.7Dockerコンテナイメージのフェッチ......................................。 .................................................。 .................................................。 ..........................................。 2019-07-1215:28:56 / <working-development-path> /sam-app/.aws-sam/build/HelloWorldFunctionを/ var / task:roとしてマウントし、ランタイムコンテナ内で委任 START RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72バージョン:$ LATEST END RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72
curlコマンドで、アプリケーションにアクセスします。
curl http://127.0.0.1:3000/hello 2019-07-12 15:29:57 app.lambda_handler(python3.7)を呼び出す 2019-07-12 15:29:57共有クレデンシャルファイルでクレデンシャルが見つかりました:〜/ .aws / credentials lambci / lambda:python3.7Dockerコンテナイメージを取得しています...... 2019-07-1215:29:58 / <working-development-path> /sam-app/.aws-sam/build/HelloWorldFunctionを/ var / task:roとしてマウントし、ランタイムコンテナ内で委任 START RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72バージョン:$ LATEST END RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72 REPORT RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72期間:7.92ミリ秒請求期間:100ミリ秒メモリサイズ:128 MB最大使用メモリ:22 MB { "statusCode":200、 "body": " { \" message \ ":\" hello world \ "}"}
sam local invokeで、lambda関数を直接呼び出し、指定した入力イベントを渡します。
sam local invoke "HelloWorldFunction" -e events/event.json 2019-07-01 14:08:42共有クレデンシャルファイルでクレデンシャルが見つかりました:〜/ .aws / credentials 2019-07-01 14:08:42 app.lambda_handler(python3.7)を呼び出しています lambci / lambda:python3.7Dockerコンテナイメージの取得......................................。 .................................................。 .................................................。 .................................................。 .................................................。 .................................................。 .................................................。 .................................................。 .................................................。 .................................................。 .................................................。 ...。 2019-07-0114:09:39ランタイムコンテナ内で委任された/<working-development-path>/sam-app/.aws-sam/build/HelloWorldFunctionを/ var / task:roとしてマウント START RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72バージョン:$ LATEST END RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72 REPORT RequestId:52fdfc07-2182-154f-163f-5f0f9a621d72期間:3.51ミリ秒請求期間:100ミリ秒メモリサイズ:128 MB最大使用メモリ:22 MB { "statusCode":200、 "body": " { \" message \ ":\" hello world \ "}"}
AWS SAMのまとめ
- AWSのSAMは、サーバレスアプリケーション構築のフレームワーク
- SAMでアプリを作成するんは、SAM CLIを利用する
- SAM CLIにて、アプリのビルド、デプロイ、ローカル環境でのテストが可能