はじめに
サーバーレスアプリケーションを作りたいときのとっかかりとして、 AWS SAM が非常に便利だったのでメモしておきます。ダラダラしてたら2020年はじめての記事になってしまいました。
AWS SAMとは
公式の解釈は公式を見てもらうとして、触った印象としては Lambda と API Gateway (の CloudFormation テンプレート) のコードをまとめて管理するためのフレームワーク という感じです。「sam」という CLI ツールを通して、テストやデプロイが可能です。Lambda で動かすプログラムだけでなく、エンドポイントである API Gateway もセットで管理できる仕組みである、というところがミソではないかと。
ていねいに解説できるほど理解していないので、さわりだけ。
インストール
私は pyenv 環境なので、 --user
オプションはつけません。
pip install aws-sam-cli
ひな形の作成
sam init コマンドを実行すると、ウィザード形式でひな形を出力してくれます。
$ sam init Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Which runtime would you like to use? 1 - nodejs12.x 2 - python3.8 3 - ruby2.7 4 - go1.x 5 - java11 6 - dotnetcore2.1 7 - nodejs10.x 8 - python3.7 9 - python3.6 10 - python2.7 11 - ruby2.5 12 - java8 13 - dotnetcore2.0 14 - dotnetcore1.0 Runtime: 2 Project name [sam-app]: Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git AWS quick start application templates: 1 - Hello World Example 2 - EventBridge Hello World 3 - EventBridge App from scratch (100+ Event Schemas) Template selection: 1 ----------------------- Generating application: ----------------------- Name: sam-app Runtime: python3.8 Dependency Manager: pip Application Template: hello-world Output Directory: . Next steps can be found in the README file at ./sam-app/README.md
ディレクトリ構成は tree の出力が文字化けして萎えたので割愛しますが、アプリ作るにあたってキモは以下の2つだと思います。
Lambda コードのアップロードと CloudFormation テンプレートの作成
Lambdaのコードは、事前に作成しておいた S3 バケットへアップロードします。 sam package コマンドでバケット名を指定してください。あわせて、 template.yaml から CloudFormation テンプレートを作成します。コードが格納されたバケットの ARN などを自動で置き換えてくれます。
$ sam package --template template.yaml --output-template-name packaged.yaml --s3-bucket test-bucket
デプロイ
sam deploy コマンドでデプロイします。 正常に作成できれば、 output で API Gateway のエンドポイント URL が表示されるはずです。
$ sam deploy --template-file path/to/template --stack-name test-stack --capabilities CAPABILITY_IAM
Makefile 作っておくと更にお手軽
Lambda のコードを変更するたびに sam package して sam deploy するのが面倒なので、 Makefile を作って make 一発でどっちもやってくれるようにしてます。本来ならローカルでテストすりゃいいんですけども。
おわり
AWSCLI がインストール済みなら、マネジメントコンソールからポチポチやるよりも SAM を使ったほうが楽だと思います。楽 = Lambda や API Gateway のことよく分かってなくてもとりあえず動かせるって意味を多分に含んでいるんですが、サーバーレス環境の雰囲気だけでもつかんでおけると、各プロダクトの理解もしやすいんじゃないかと思います。