でこてっくろぐ ねお

UbieのSRE。でこらいふろぐ(http://dekolife.hatenablog.com/)の姉妹版。デコテックログ(deko tech log)である

aws cloudformation packageを使ってGoで書かれたAWS Lambdaをデプロイする例

世間ではLambdaをデプロイするのにapexを使うのがいいかcloudformationを使ってデプロイするのがいいか、みたいな話があると思いますので、cloudformationでのデプロイ方法をここに書くことでその判断の一助になれば、及び、世間ではcloudformation packageコマンドの認知度が低い感じがするのでそれについてももっと知らしめたいという感じでこのエントリ書いてます。

公式ドキュメント

package — AWS CLI 1.15.10 Command Reference

簡単な例での解説

ファイルの準備

以下のディレクトリ構造だったとします

├── template.yml // cloudformationのyamlファイル
├── build
    └── lambda-go // `$ GOARCH=amd64 GOOS=linux go build` とかでビルドされてできたバイナリ

template.ymlの単純な例(これは簡単のためAWS SAMを使っていますが、aws cloudformationコマンドでもだいたい考え方は一緒で、ただ以下 CodeUri の代わりに Code を使う感じになります)

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Resources:
  xxxxxxxxxx: # 好きな名前をどうぞ
    Type: AWS::Serverless::Function
    Properties:
      Handler: lambda-go # 上記バイナリのファイル名
      Runtime: go1.x
      CodeUri: build # 上記lambda-goが存在するディレクトリ名

また、別途、成果物をuploadするためのS3バケットを作っておく必要があります。

デプロイ

まず、以下コマンドによってファイルをS3にuploadし、上記CodeUri部分をS3のURLに書き換えたcloudformationのtemplateファイル(output.yml)を生成します。

$ aws cloudformation package \
        --template-file template.yml \
        --s3-bucket $(上記成果物をuploadするためのS3バケット) \
        --s3-prefix $(S3バケット内でプレフィックスをつけたかったらこれを指定) \
        --output-template-file output.yml

そして、以下コマンドによって、上記コマンドで生成された output.yml を使用してLambdaがデプロイされます

$ aws cloudformation deploy \
        --template-file output.yml \
        --stack-name $(CloudFormationのスタック名(任意)) \
        --capabilities CAPABILITY_IAM

めでたしめでたし。

上記の仕組みが使われているMakeflieとCloudFormationのyamlファイルの紹介

動いている様子は以下リポジトリtemplate.yml 及び Makefile で見ることができます。さっきもデプロイ成功しました。 Makefileの中身を見ても aws-sam-localコマンドはあるけどaws cloudformationが出てこないじゃないか 、という話はありますが、これは aws cloudformation コマンドの代わりに aws-sam-local コマンドを使用している、という理解で大丈夫ですので、入れ替えてもらって大丈夫です。

github.com

Go以外のデプロイ

  • 基本的には上記と同じでPythonやNodeも、Zipファイルさえ作ってしまえば後は上記Goと同様にできるはずです(Nodeはやったことないけど)