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/
の一つ上の階層で行います。
次にやることが表示されますので一番下のデプロイコマンドを実行します。
--guided
を付けると対話式になるので必要な項目を入力します。Stack Name とRegionくらいでいいと思います。
最後まで回答するとデプロイが始まり、問題なければ samconfig.toml
が生成されます。2回目以降は --guided
を付けなくてもよさそうです。
確認
実際にデプロイが完了したか確認します。
sam-lambda-sample
というLambda関数化が作成されていますね。
Lambda関数を実行するIAM Roleも作られています。(ちょっと名前が微妙です)
Lambda関数を呼び出すCLoudWatchのイベントルールも作成されています。今回はCron形式で1分毎に設定されています。
デプロイしたLambda関数が実際に実行されているかCLoudWatch Logsで確認してみます。
環境変数 PERMIT
の値が出力されていますね。
作成したLambdaの削除
いろいろ作成されましたが削除するときはCloudFormationを削除すれば全て消えます。
CloudFormationから削除すると、LambdaやCloudWatchのLog、Eventなど全て削除されます。
サンプルコード
githubなんぞも載せておきます。