shinobe179の日記

パケットの気持ちになって考えるのはもうやめだ

【AWS】AWS SAM(Serverless Application Model)が手軽にサーバーレス環境作れて便利で感動したって話

はじめに

 サーバーレスアプリケーションを作りたいときのとっかかりとして、 AWS SAM が非常に便利だったのでメモしておきます。ダラダラしてたら2020年はじめての記事になってしまいました。

AWS SAMとは

 公式の解釈は公式を見てもらうとして、触った印象としては Lambda と API Gateway (の CloudFormation テンプレート) のコードをまとめて管理するためのフレームワーク という感じです。「sam」という CLI ツールを通して、テストやデプロイが可能です。Lambda で動かすプログラムだけでなく、エンドポイントである API Gateway もセットで管理できる仕組みである、というところがミソではないかと。

aws.amazon.com

 ていねいに解説できるほど理解していないので、さわりだけ。

インストール

 私は 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 のことよく分かってなくてもとりあえず動かせるって意味を多分に含んでいるんですが、サーバーレス環境の雰囲気だけでもつかんでおけると、各プロダクトの理解もしやすいんじゃないかと思います。