AWS Serverless Application Model 入門ハンズオンシリーズ - log4ketancho の第1弾です。
先日、Step Functions + Lambda + DynamoDB という構成で Twitter Bot を構築しました。さっと作りたかったので手作業で構築してしまったのですが、やはりマニュアル構築はダメですね。追加したい機能はたくさんあるのに、デグレが怖くて修正が捗りません。(結局、文言修正しかできませんでした。)
- 構築の自動化
- 最低限の動作確認(テスト)
- CodeCommit 管理し、リリースまでのフローを自動化
あたりの対応をしてサクサク気軽に開発をすすめたいなー、というモチベーションで構築自動化に着手することにしました。普段であれば Serverless Framework を使うのですが、今回は Serverless Application Model、通称 AWS SAM を使って開発することにしました。せっかくなので、学んだ内容をハンズオン形式にまとめようと思います。この記事は、最初のことはじめ的な内容となります。
AWS SAM とは(再掲)
AWS が提供しているサーバレスな構成を構築するためのフレームワークです。Cloud Formation の拡張で、Lambda、API GW、DynamoDB の構築をより簡単に行える仕組みとなります。位置づけとしては、Serverless Framework と同じですね。Cloud Formation が裏側で動いているということは、最悪生の CFn テンプレートを書けば、できないことはなにもないと思っています。下記の GitHub で公開されています。
SAM 開発のざっくりとした流れ
では、SAM を用いて開発をしていきます。Serverless Framework を普段利用している私にとっては、慣れるまでかなり大変だったので(苦笑)、まずは導入編ということで Lamdba Function を構築する手順のみ紹介します。(時間ができたら、DynamoDBの作成、API GWの作成も追加します。)
ざっくりとした流れは下記の通りとなります。
- 初期設定
- AWS CLI の設定
- パッケージングしたテンプレートを置くための S3 バケットの作成
- テンプレートの作成
- Lambda Function 用 python スクリプトの作成
- テンプレートのパッケージング
- パッケージングしたテンプレートを用いて Cfn の実行
AWS CLI 初期設定
まず、AWS CLI をインストールします。
sudo pip install awscli
また、既にインストールしている方も、古いバージョンだと動きませんのでご注意ください。私のローカル環境の AWS CLI のバージョンは aws-cli/1.12.2
です。動かない場合は、最新のバージョンにアップデートしてください。
続いて、AWS CLI の設定です。IAM ユーザのキーとリージョンを指定していきます。私はローカルでいくつかプロファイルを設定しているので --profile
オプションを付けていますが、付けなくても問題ありません。
$ aws configure --profile sam-sample AWS Access Key ID [None]: A**** AWS Secret Access Key [None]: U**** Default region name [None]: ap-northeast-1 Default output format [None]: json
ここまでは恒例の手順ですね。
S3 バケットの作成
続いて S3 バケットを作成します。このあと作成する SAM テンプレートは、パッケージングという作業をしたのち、 CFn によって実行されます。パッケージングした中間成果物はS3に置く必要があるので、置き場用の S3 バケットを作成します。
$ aws s3 mb s3://ketancho-sam-sample --profile sam-sample make_bucket: ketancho-sam-sample $ aws s3 ls --profile sam-sample 2017-12-25 01:47:42 ketancho-sam-sample
テンプレートの作成
SAMテンプレート template.yaml
を作成していきます。表記の仕方は CFn のテンプレートとかなり似ています。
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: Create Lambda function by using AWS SAM. Resources: SamSampleLambda: Type: AWS::Serverless::Function Properties: Handler: functions/lambda_function.lambda_handler Runtime: python3.6 Role: arn:aws:iam::4xxxxxxxxxxx:role/lambda_dynamo Timeout: 30
Runtime
はお使いの言語によって変更してくださいRole
は各環境の ARN に置き換えてください
Lambda Function 用 python スクリプトの作成
次に Lambda Function 用の .py ファイルを作成します。テンプレート側で Handler: functions/lambda_function.lambda_handler
としたので、
- ファイル名は
lambda_function.py
とする - ハンドラ名は
lambda_handler
とする - .py ファイルはまとめておいた方が後々よいと思い、下記のようなディレクトリ構成にしていること
$ tree
.
├── functions
│ └── lambda_function.py
└── template.yaml
にご注意いただければと思います。lambda_function.py の中身については、今回はサンプルですので、
def lambda_handler(event, context): # TODO implement return 'Hello from Lambda w/ SAM!!'
としました。
テンプレートのパッケージング
では、パッケージングします。
aws cloudformation package \ --template-file template.yaml \ --s3-bucket ketancho-sam-sample \ --output-template-file packaged-template.yaml \ --profile sam-sample
このコマンドで CFn テンプレート packaged-template.yaml
が生成される、と理解しています。
パッケージングしたテンプレートを用いて Cfn の実行
最後に、パッケージング済みのテンプレートを用いてデプロイしてみます。
aws cloudformation deploy \ --template-file packaged-template.yaml \ --stack-name sam-sample-stack \ --capabilities CAPABILITY_IAM \ --profile sam-sample
デプロイできているか確認
Lambda Function を確認してみます。
うまくデプロイできていました!
中間生成物を作るフローを理解できていなかったことと、Serverless Framework の方が慣れていることもあり、
slsのが簡単に思えるのは初めて使うからだろうか。
— @ketancho (@ketancho) 2017年12月24日
と愚痴るくらいには苦労したのですが、一度理解してしまえばそれほど難しくないと思います。まだ Serverless Framework との比較ができるほど使い込んでいないのですが、SAM が AWS 公式であること、SAM Local なる便利機能があることから、もう少し SAM の世界に浸かってみて使いこなせるようになりたいと考えています。
次は、Lambda Function 周りの機能について紹介します。
この記事は、AWS Serveless Application Model 入門シリーズの第1弾です。