LoginSignup
0
0

More than 1 year has passed since last update.

Lambdaテンプレート_AWS SAM版

Posted at

はじめに

以前、CloudFormationで単純なLambda関数を作成するテンプレートを記事にしました。

今回は、AWS SAMで作りましたのでそちらも記事にします。
Cloud9上のAWS Toolkitで実行することを想定しています。

テンプレート

以下に、テンプレートの解説をしていきます。

フォルダ構成

CloudFormationとは異なり、ファイルが複数に分かれています。フォルダの構成を以下のようにしました。

sample-sam
├── function
│   ├── function.py
│   └── requirements.txt
└── template.yaml
  • function/function.py
    • Lambda関数のスクリプトを記述するファイル。
  • function/requirements.txt
    • Lambda関数で使うPythonのライブラリを記述するファイル。
    • 今回は外部のライブラリは使わないので0バイト。忘れないように置いているだけ。
  • template.yaml
    • 構成の設定を記述するファイル。ほぼCloudFormationと同じ。

各ファイルの中身

function/function.py

単純に文字列をprintして、リターンするだけのものです。

def lambda_handler(event, context):

    print('sample function')
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }

template.yaml

内容は以前の記事のCloudFormationのものと一緒です。

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Lambda Function

Parameters:
    LambdaFunctionName:
        Type: String
        Default: "testfunction001"

Resources:
    FunctionRole:
        Type: AWS::IAM::Role
        Properties:
            RoleName: !Sub "for-lambdafunction-${LambdaFunctionName}"
            AssumeRolePolicyDocument:
                Version: 2012-10-17
                Statement:
                    -   Effect: Allow
                        Principal:
                            Service:
                                - lambda.amazonaws.com
                        Action:
                            - 'sts:AssumeRole'
            Path: '/service-role/'
            Policies:
                # CloudWatch
                -   PolicyName: write-cloudwatchlogs
                    PolicyDocument:
                        Version: 2012-10-17
                        Statement:
                            -   Effect: Allow
                                Action: 
                                    - 'logs:CreateLogStream'
                                    - 'logs:PutLogEvents'
                                Resource: !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${LambdaFunctionName}:*"

    FunctionLogGroup:
        Type: AWS::Logs::LogGroup
        Properties:
            LogGroupName: !Sub /aws/lambda/${LambdaFunctionName}
            RetentionInDays: 3653

    TargetFunction:
        Type: AWS::Serverless::Function
        Properties:
            FunctionName: !Ref LambdaFunctionName
            Role: !GetAtt FunctionRole.Arn
            CodeUri: function/
            Handler: function.lambda_handler
            Runtime: python3.9

1点、パラメータにデフォルト値を設定しています。
これは、AWS Toolkitのウィザードでデプロイしようとすると、デフォルトのパラメータが無い場合は.aws/templates.jsonというファイルで宣言するように促されるのですが、このファイルの記載の仕方がわからないので、デフォルト値を使うようにするためです。
どなたか、.aws/templates.jsonの記法をご存じの方は教えてください。

使い方 On Cloud9

まずはCloud0にファイル群を置きます。Fileからファイルアップロードを選択します。

image.png

ポップアップが出てきます。ここに、フォルダごとドラッグアンドドロップすれば、フォルダごとアップしてくれます。

image.png

後は以前書いた記事を参考にしていただければ、デプロイできます。

1点、以下の画面の様にパラメータを上書きするか聞かれますが、デフォルト値を使う場合は"No"を選んでください。
.aws/templates.jsonの記法がわかり、そちらで宣言したい方はYesを選んでください。

image.png

他は前の記事の通りです。
ここから少しずつブラッシュアップしていく、という使い方を考えています。

おわりに

Lambda関数のテンプレートをAWS SAMで作りました。
CloudFormationだとどうしてもLambda関数のスクリプトを直書きするか、別ファイルにしてZip圧縮してS3にアップして・・・、と手間でしたが、AWS SAMだと、圧縮してS3アップをやってくれるので、手間が非常に軽減できて、開発がスムーズにできそうです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0