この記事で分かること
- AWS Serverless Application Model (AWS SAM) の概要
- SAM を使って API Gateway + Lambda のサーバレスな API を構築するまでの流れ
Serverless Application Model (AWS SAM) とは
- 簡単に言うとサーバレスな構成を作ることに特化した Cloudformation のテンプレート
- Cloudformation と同様にリソースをひとまとめに管理 (作成 / 更新 / 削除) することができる
SAM を使って API Gateway + Lambda を構築してみる
事前準備
AWS CLI を使えるようにしておく
SAM では AWS CLI を使ってスタックの作成/更新/削除を行うので、ローカル環境で AWS CLI を実行できるようにしておく必要があります。
- AWS CLI の インストーラー を取得して、インストーラーの指示に従ってインストール
- ちゃんとインストールされたか確認(バージョン情報が返って来ればOK)
$aws --version
aws-cli/1.11.156 Python/2.7.9 Windows/7 botocore/1.7.14
CLI 実行時の設定を config, credentials に書き込んでおく
AWS CLI はユーザーディレクトリ配下の config, credentials を参照するため、認証情報や諸々の設定を書き込んでおきます。
- config 設定のコマンド実行(対話式で設定)
$aws configure
AWS Access Key ID [None]: ← CLI を実行する IAM ユーザーのアクセスキー
AWS Secret Access Key [None]: ← CLI を実行する IAM ユーザーのシークレットキー
Default region name [None]: ← 好きなリージョン
Default output format [None]: ← json を設定しておけば無難
※ユーザーディレクトリ配下の config, credentials を確認(設定した内容が記載されているはず)
S3 バケットの作成
SAM では必要なファイル一式を S3 に置く必要があるので、その置き場を先に用意しときます。
ここでは sam-test というバケットにします。
IAM ロールを用意
SAM が API Gateway と Lambda と S3 にアクセスできるように IAM Role を作成しておきます。
ここでは sam-test-role というロールにします。
SAM のテンプレートを書く
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: sample
Resources:
SamSample:
Type: AWS::Serverless::Function
Properties:
Handler: index.handler # 実行するハンドラ
Runtime: nodejs4.3 # lambda のランタイムを書く
Role: arn:aws:iam::1234567890:role/sam-test-role # 上の手順で作った IAM Role の Arn
Timeout: 60 # Lambda のタイムアウト
Events:
GetResource: # API Gateway 側の識別子
Type: Api
Properties:
Path: /test # API Gateway のリソースのパス
Method: put # API Gateway のメソッド
※同じ階層に Lambda が実行するコード(今回の場合は index.js)を配置しておく必要があります。
SAM のスタックを作る
1 . S3 にファイル一式をパッケージ化して配置する
aws cloudformation package --template-file template.yaml --output-template-file template-output.yaml --s3-bucket sam-test
2 . スタックを作成
aws cloudformation deploy --template-file template-output.yaml --stack-name SamTest --capabilities CAPABILITY_IAM
上記のコマンドを実行するだけで、API Gateway + Lambda のサーバレスな構成がプロビジョニングされているはずです。
注意点
- node.js の場合 npm のパッケージは node_modules がローカルに展開されている状態で package コマンドを実行する必要があります
- template.yaml 内の各リソースの名前にはハイフンは使えないので注意
今後やりたいこと
折角作ったので API Gateway + Lambda 構成のアプリケーションを作ってみて、活用してみたいです。