練馬日記

練馬はあんまり関係ないかも

SAMでLambdaをデプロイする

Lambda使ってますか、いいですよねLambda。使った分しか課金されないし無料枠多いし。 そんなみんな大好きLambdaをCLIで登録する小技を紹介します。

AWSにアカウントがあってCLIからAWS環境に接続済みの前提で、Mac環境で作業することとします。

goまわりの設定とか、awsまわりの環境設定はここでは省きます。

SAMのインストール

SAM CLIをインストールします。homebrewはインストールしておいて下さい。

brew install aws-sam-cli

公式のインストール方法はこちら

Lambdaプログラムの用意

今回はgoで記述します。

ディレクトリ構成はこちら。

template.yaml
src/
  main.go
  go.mod
  go.sum

環境変数を読み込んでログ出力するだけのプログラムです。

package main

import (
    "context"
    "log"
    "os"

    "github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context) error {
    s := os.Getenv("PERMIT")
    log.Printf("PERMIT: %s", s)
    return nil
}

func main() {
    lambda.Start(handler)
}

go get 等しておきます。

テンプレート編集

つづいてSAMのテンプレートを編集します。SAMはServerless Application Modelの略です。

公式のドキュメントはこちら

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam_lambda_sample
  
  SAM Template for sam_lambda_sample

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 180

Resources:
  SamLambdaSampleFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: src/
      Handler: sam-lambda-sample
      FunctionName: sam-lambda-sample
      Runtime: go1.x
      EventInvokeConfig:
        MaximumRetryAttempts: 0
      Events:
        ScheduledEvent:
          Type: Schedule
          Properties:
            Name: sam-lambda-sample-schedule
            Schedule: cron(* * * * ? *)
      Environment:
        Variables:
          PERMIT: "1"
      Tags:
        AppNameTag: sam-lambda-sample

  SamLambdaSampleLogGloup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /aws/lambda/${SamLambdaSampleFunction}
      RetentionInDays: 7

Outputs:
  SamLambdaSampleFunction:
    Value: !GetAtt SamLambdaSampleFunction.Arn
  SamLambdaSampleFunctionIamRole:
    Value: !GetAtt SamLambdaSampleFunctionRole.Arn

ここでは次のことをしています。

  • Lambda関数の設定
  • CloudWatchのEventによるスケジュール起動の設定(cron型で1分毎に起動)
  • 環境変数 PERMIT
  • CloudWatchのロググループの出力設定
  • IAMロールの設定

ビルド・デプロイ

以下の様にコマンドを打つとawsに設定内容一式が作成されます。

sam build
sam deploy --guided

ビルドは src/ の一つ上の階層で行います。

samでビルドしたところ

次にやることが表示されますので一番下のデプロイコマンドを実行します。

デプロイコマンドを打ったところ

--guided を付けると対話式になるので必要な項目を入力します。Stack Name とRegionくらいでいいと思います。

最後まで回答するとデプロイが始まり、問題なければ samconfig.toml が生成されます。2回目以降は --guided を付けなくてもよさそうです。

確認

実際にデプロイが完了したか確認します。

Lambdaが作成されています

sam-lambda-sample というLambda関数化が作成されていますね。

IAM Roleも作成されています

Lambda関数を実行するIAM Roleも作られています。(ちょっと名前が微妙です)

CloudWatch Eventも作成されています

Lambda関数を呼び出すCLoudWatchのイベントルールも作成されています。今回はCron形式で1分毎に設定されています。

CLoudWatch LogsのLogGroupも出力されています

デプロイしたLambda関数が実際に実行されているかCLoudWatch Logsで確認してみます。 環境変数 PERMIT の値が出力されていますね。

作成したLambdaの削除

いろいろ作成されましたが削除するときはCloudFormationを削除すれば全て消えます。

CloudFormationが出来ています

CloudFormationから削除すると、LambdaやCloudWatchのLog、Eventなど全て削除されます。

サンプルコード

githubなんぞも載せておきます。

github.com