🏇

最速でLambdaを用意するCloudFormationテンプレート

2022/10/13に公開

この記事の概要

intro

ちょっとLambdaの検証をしたい時や、書き捨てのLambdaを用意したいシーンがあると思います。
画面からポチポチして作った場合
IAMロールやロググループなど、不要なリソースは関数を消しても残りがちです。

実体とスタックが合っている必要もないですし、HelloWorld関数をCloudFormationで作って
そこから色々改変していけば、関数の片付けも簡単に出来ますね。

今回作れるもの

  • LambdaのHelloWorld関数
  • Lambda実行用IAMロール
  • ロググループ

やり方

テンプレートの用意

以下のコードをエディタ等に貼り付けて、保存して下さい。

コード(クリックで開く)
tmp-lambda.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: temporary lambda function
Parameters:
    FunctionName:
        Description: Function Name you want to create.
        Type: String
#    S3Bucket:
#        Description: location of artifact
#        Type: String
#    DeployPackageName:
#        Description: Zip Package Name you has been uploaded.
#        Type: String

Resources:
######## Lambda Function
    LambdaFunction:
        Type: AWS::Lambda::Function
        Properties:
            Description: Lambda Function
            FunctionName: !Ref FunctionName
            Architectures:
                - x86_64
            Handler: index.lambda_handler
#            Code:
#                S3Bucket: !Ref S3Bucket
#                S3Key: !Ref DeployPackageName
            Code:
                ZipFile: |
                    import json

                    def lambda_handler(event, context):
                        # TODO implement
                        return {
                            'statusCode': 200,
                            'body': json.dumps('Hello from Lambda!')
                        }
            MemorySize: 128
            Role: !GetAtt IAMRole.Arn
            Runtime: python3.8
            Timeout: 30
            TracingConfig: 
                Mode: PassThrough
        DependsOn: IAMRole

######## Lambda Log Group
    LogsLogGroup:
        Type: AWS::Logs::LogGroup
        Properties:
            LogGroupName: !Sub "/aws/lambda/${FunctionName}"
            RetentionInDays: 14
        DependsOn: LambdaFunction

######## IAMRole
    IAMRole:
        Type: AWS::IAM::Role
        Properties:
            Path: /
            RoleName: !Sub ${FunctionName}-role
            AssumeRolePolicyDocument: |
                {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                        "Effect": "Allow",
                        "Principal": {
                            "Service": "lambda.amazonaws.com"
                        },
                        "Action": "sts:AssumeRole"
                        }
                    ]
                }
            MaxSessionDuration: 3600
            ManagedPolicyArns: 
              - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
            Description: Allows Lambda functions to call AWS services on your behalf.

CloudFormationスタックの作成

Step1:テンプレートの指定

CloudFormation > スタック > スタックの作成 > 新しいリソースを使用 (標準)

テンプレートファイルのアップロード > ファイルの選択 > 前項で保存したファイルを選択

Step2:スタックの詳細を指定

スタック名・パラメータ(関数名)に任意の値を入力

Step3:スタックオプションの設定

特になにもせず次へ

Step4:レビュー

□ AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。
☑を入れる

スタックの作成

ポイント

LambdaをCloudFormationでデプロイする場合、S3にコードを置いて指定するのが一般的ですが
CloudFormationにLambdaのソースコードをベタ書きするやり方も存在します。

            Code:
                ZipFile: |
                    import json
		    ~(略)~

この場合、ハンドラーがindex.lambda_handlerになることに注意して下さい。
コンソールからの手作りだと恐らく別の値になるはずです。

outro

検証用のリソースなど、作った人がいなくなった時に遺物となりがちなものは
時に現場を混乱させることがある思います。作ったものは片付けましょう(戒め)

Discussion