2018年1月27日

AWS SAMを使ってみる

Share

AWS SAMとは

Github : AWS Serverless Application Model (AWS SAM)

The goal of AWS SAM is to define a standard application model for serverless applications. This GitHub project is the starting point for AWS SAM, and contains general information, information about the model, and examples of common applications.

日本語訳

AWS SAMの目標は、サーバレスアプリケーション用の標準アプリケーションモデルを定義することです。 このGitHubプロジェクトは、AWS SAMの出発点であり、一般的な情報、モデルに関する情報、一般的なアプリケーションの例を含んでいます。

AWS::Serverless 変換

ここを見る限りだと、

AWS SAMはCloudformationの拡張で、最終的にはCloudformationのテンプレートに展開されるイメージ。

やること

基本的には、待望のAWS LambdaのGolang対応! ここでやったことの、コンソールでの作業をコマンドベースでやろう!ということです。

サンプル

Githubにサンプルがあるので、一番シンプルなhello_worldを参考にしてみる。

テンプレート

  • lambda-go.yaml
AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda go sample application.
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: main
      Runtime: go1.x
      CodeUri: "./../../lambda-go-sample/main.zip"

package & deploy

Reference : cloudformation package

ここでは、

S3のバケットはAWS CloudformationをAWS CLIから使ってみるでサンプルで作成済のバケットを使用します。※基本的になんでも良いと思います。

$ aws cloudformation package \
--template-file ./lambda-go.yaml \
--s3-bucket techteco.sample.bucket \
--s3-prefix lambda-go-sample \
--output-template-file packaged-template.yaml

ここまでで、S3にpackageがアップロードされています。

出力されたpackaged-template.yamlをつかってdeploy

ちなみに、出力内容はこちら

AWSTemplateFormatVersion: '2010-09-09'
Description: lambda go sample application.
Resources:
  HelloWorldFunction:
    Properties:
      CodeUri: s3://techteco.sample.bucket/lambda-go-sample/737fd29b764003ecb0a9c10ee290bfd9
      Handler: main
      Runtime: go1.x
    Type: AWS::Serverless::Function
Transform: AWS::Serverless-2016-10-31

Reference : cloudformation deploy

$ aws cloudformation deploy \
--template-file packaged-template.yaml \
--stack-name sampleSamLambdaGo \
--capabilities CAPABILITY_IAM

動作確認

まずは、Cloudformationのstackの中身

$ aws cloudformation describe-stack-resources \
--stack-name sampleSamLambdaGo \
| jq .
{
  "StackResources": [
    {
      "StackName": "sampleSamLambdaGo",
      "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/sampleSamLambdaGo/28efadc0-088c-11e8-b769-50a68a175a82",
      "LogicalResourceId": "HelloWorldFunction",
      "PhysicalResourceId": "sampleSamLambdaGo-HelloWorldFunction-YAWCC305TVCA",
      "ResourceType": "AWS::Lambda::Function",
      "Timestamp": "2018-02-03T02:46:15.113Z",
      "ResourceStatus": "CREATE_COMPLETE"
    },
    {
      "StackName": "sampleSamLambdaGo",
      "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/sampleSamLambdaGo/28efadc0-088c-11e8-b769-50a68a175a82",
      "LogicalResourceId": "HelloWorldFunctionRole",
      "PhysicalResourceId": "sampleSamLambdaGo-HelloWorldFunctionRole-1HGTSQ58UEK91",
      "ResourceType": "AWS::IAM::Role",
      "Timestamp": "2018-02-03T02:46:09.876Z",
      "ResourceStatus": "CREATE_COMPLETE"
    }
  ]
}

正しく実行されればOK!

$ aws lambda invoke \
--invocation-type Event \
--function-name sampleSamLambdaGo-HelloWorldFunction-YAWCC305TVCA \
--payload '{"name": "テスト太郎"}' \
outputfile.txt