SAM CLIのコマンドまとめ
SAM CLIで何ができるんだっけ?をまとめます。
はじめに
SAM CLIとは
AWS SAMテンプレートを使用したサーバーレスアプリケーションの構築を実行・開発のためのコマンドラインツール
SAM CLIのインストールについてはこちら
コマンドリファレンス
あります。困ったら、あるいは特定の何かをしたくなったらここを見る。
主なSAM CLIコマンド
新規アプリケーションを初期化:sam init
新しくAWS SAMプロジェクトを初める場合はsam init
デプロイの準備:sam build
ローカル実行やデプロイを行う前に、アプリケーションを準備するコマンド。
このコマンドを実行すると.aws-samというディレクトリが作成される。
例えば:.aws-sam/buildディレクトリ下にコンパイルされたLambda関数のコードが格納される
AWSクラウド上にデプロイ:sam deploy
AWSクラウド上にアプリケーションをデプロイ。
.aws-sam/ディレクトリ内のアーティファクトをデプロイするため、変更がある場合はデプロイ前にsam buildを実行して.aws-sam/ディレクトリを更新する。
初回デプロイではsam deploy --guidedを実行してデプロイ設定を構成(samconfig.toml)、以降はsamconfig.tomlの設定を利用してsam deployのみでデプロイができる。
変更の同期:sam sync
ローカルの変更をAWSクラウドに同期する。
sam deployとの違いとしては、samconfig.tomlを使用しない・CloudFormationの変更セットを使用しないという点です。
--codeオプション
ローカルファイルのコード変更のみを反映
--watch
ローカルファイルの変更をウォッチ、保存時に即反映されます。
便利!
sam syncはAWS SAM Accelerateを利用しています。アプリケーションの作成・テストが簡単に早く実行できます。
AWS SAMリソースの確認
sam list {subcommands}
で現在のリソースを確認することができます。
-
endpoints
クラウドまたはローカルのエンドポイントを表示 -
resources
SAMテンプレートで定義・CloudFormationにより作成されたリソースを表示。 -
stack-outputs
CloudFormationスタックの出力を表示。
アプリケーションをローカルで実行:sam local
SAM CLIはDockerを利用して、ローカルHTTPサーバーを通じてLambda関数をローカル環境で実行できます。
API Gatewayエンドポイントにより呼び出すLambda関数のテストに役立ちます。
※Dockerを使用するため、Docker環境が準備できていることが使用前提
ローカルHTTPサーバーの起動と使用
sam local start-api
このコマンドを実行すると、HTTPサーバーエンドポイントが以下のように出力されます。
Mounting DeleteFunction at http://127.0.0.1:3000/delete/{id} [DELETE]
Mounting CreateFunction at http://127.0.0.1:3000/create [POST]
Mounting UpdateFunction at http://127.0.0.1:3000/update/{id} [POST]
Mounting ReadFunction at http://127.0.0.1:3000/read/{id} [GET]
ローカルHTTPサーバーを起動した状態で上記エンドポイントを使用することでLambda関数のローカル実行が可能です。
$ curl "http://127.0.0.1:3000/read/1"
{"result":{"id":{"S":"1"},"name":{"S":"Sam"}}}
Lambda関数を単体でローカル実行する
sam local invoke {リソースID}
このコマンドを実行するとLambda関数をローカルで呼び出すことができます。
リソースIDで指定するのは論理IDです。
sam list resoucesを実行して出力されるLogical IDを指定します。
他にもある
あります。が、最低限押さえておきたいコマンドをまとめたので今回はここまで!
調べていると、AWS SAMはサーバーレスアプリケーションの開発のための様々な機能があることが分かりました。やりたいことがあれば、その都度調査して実現することができると思います。
特にAWS SAM Accelerateは興味深かったです。改めて深掘りしてみたいです。
Discussion