日々ろぐ

人に優しく٩( 'ω' )و

AWS SAM で HelloWorld

タイトルの通り。

2020/07/21 に AWS SAM CLI がGAされたようで、前から気になってたし少し触ってみようかなと思った次第です。

AWS サーバーレスアプリケーションモデル (SAM) CLI が一般提供を開始し、本番環境で利用可能に

調べてみると、v1.0.0より前はビルドに至るまでにコマンドがいくつかあったりして、今回触ったv1.0.0と少々様子が異なるようですね。。
ネットで拾った情報もv0.X.Xのものが多かったので、ここはやはり公式ドキュメントを見つつ進める方がよいでしょう。

AWS SAM ?

公式には、

AWS サーバーレスアプリケーションモデル (AWS SAM) は、AWS でサーバーレスアプリケーションを構築するために使用することができるオープンソースフレームワークです。
サーバーレスアプリケーションは、Lambda 関数、イベントソース、およびその他のリソースを組み合わせたもので、協調して動作することによってタスクを実行します。サーバーレスアプリケーションは単なる Lambda 関数ではないことに注意してください。API、データベース、イベントソースマッピングなどの追加リソースを含めることができます。
とはAWS Serverless Application Model(AWS SAM)? - AWS Serverless Application Model より引用

とあります。
Lambda や API Gataway、DynamoDB の管理を簡単にできるフレームワークという感じかな。
AWS SAM のテンプレートを使用して、CloudFormation でデプロイするという流れになるので、サーバーレスに特化した CloudFormation というところでしょうか。

Hello World までの道のり

チュートリアルに HelloWorld があるので、それを試してみます。

まずは AWS SAM CLI のインストール。
(ちょっと時間かかります)

$ brew tap aws/tap
$ brew install aws-sam-cli

こちらにも書いてありますが、事前に Docker のインストール及びプロジェクトフォルダの共有を行っておく方がよいです。
※ローカルでエミュレーションする場合に必要になります。

docs.aws.amazon.com

蛇足ですが、AWS SAM CLI をインストールしたところ、僕のローカルの Python のバージョンが 3.7 から 3.8 に上がってました。

インストールが終わったらまずはバージョン確認

$ sam --version
SAM CLI, version 1.0.0

作業フォルダに移動してテンプレートを作成

$ mkdir samtest
$ cd samtest
$ sam init

今回は node.js で HelloWorld してみます。

f:id:massyuu-d:20200805095359p:plain

sam init コマンドにより、 samtest ディレクトリにいくつかファイルが作られました。
hello-world/app.js がラムダハンドラのロジックの実態のようです。
また、リソースの定義などは template.yaml に記載されています。

この sam init で 生成されたファイルは、こちらのリポジトリから取得してきたようです。
HelloWorld 以外にも、選択肢にあったテンプレートを確認することができます。

github.com

次に、これらをビルドします。

$ sam build

f:id:massyuu-d:20200805100112p:plain

これでビルドが完了して、 .aws-sam/build にファイルが生成されました。

あとはヒントが出ているように、ローカルで実行する場合は sam local invoke を、AWSにデプロイする場合は sam deploy --guided を実行します。
※ローカルで実行する(エミュレートする)場合は、先述の Docker の準備が必要になります。

今回はこのままAWSにデプロイしてみます。
初回のデプロイになるので、 --guided オプションを追加します。これにより、対話的に構成を設定することができ、設定された構成を samconfig.toml に保存することができます。

f:id:massyuu-d:20200805101233p:plain

最終的に CloudFormation のスタックが終了し、以下のような出力がされればデプロイ成功です。

f:id:massyuu-d:20200805101725p:plain

あとは、作成したAPIにアクセスしてみます。
先ほど出力された HelloWorldApi の Value にある URL を叩いて結果を確認します。

$ curl https://XXXXXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

{"message":"hello world"}%

とりあえず今日はここまで。