【AWS SAM 入門①】セットアップから簡単なLambda Functionの作成まで

 AWS Serverless Application Model 入門ハンズオンシリーズ - log4ketancho の第1弾です。

 先日、Step Functions + Lambda + DynamoDB という構成で Twitter Bot を構築しました。さっと作りたかったので手作業で構築してしまったのですが、やはりマニュアル構築はダメですね。追加したい機能はたくさんあるのに、デグレが怖くて修正が捗りません。(結局、文言修正しかできませんでした。)

www.ketancho.net

  • 構築の自動化
  • 最低限の動作確認(テスト)
  • CodeCommit 管理し、リリースまでのフローを自動化

あたりの対応をしてサクサク気軽に開発をすすめたいなー、というモチベーションで構築自動化に着手することにしました。普段であれば Serverless Framework を使うのですが、今回は Serverless Application Model、通称 AWS SAM を使って開発することにしました。せっかくなので、学んだ内容をハンズオン形式にまとめようと思います。この記事は、最初のことはじめ的な内容となります。

AWS SAM とは(再掲)

 AWS が提供しているサーバレスな構成を構築するためのフレームワークです。Cloud Formation の拡張で、Lambda、API GW、DynamoDB の構築をより簡単に行える仕組みとなります。位置づけとしては、Serverless Framework と同じですね。Cloud Formation が裏側で動いているということは、最悪生の CFn テンプレートを書けば、できないことはなにもないと思っています。下記の GitHub で公開されています。

github.com

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 を確認してみます。

f:id:ketancho_jp:20171225025533p:plain

うまくデプロイできていました!

 中間生成物を作るフローを理解できていなかったことと、Serverless Framework の方が慣れていることもあり、

と愚痴るくらいには苦労したのですが、一度理解してしまえばそれほど難しくないと思います。まだ Serverless Framework との比較ができるほど使い込んでいないのですが、SAM が AWS 公式であること、SAM Local なる便利機能があることから、もう少し SAM の世界に浸かってみて使いこなせるようになりたいと考えています。

 次は、Lambda Function 周りの機能について紹介します。

www.ketancho.net

 この記事は、AWS Serveless Application Model 入門シリーズの第1弾です。

www.ketancho.net