AWS CloudFormationでLambdaをデプロイする方法

AWS CloudFormationでLambdaをデプロイする方法

CloudFormationでLambdaをデプロイする方法です。

CloudFormationは単なるyamlなので、VSCodeのプラグイン「Yaml」をインストールして設定しておくと少し捗ります。

設定方法は「OpenAPI3.0やCloudFormationのYamlをVSCodeで作成する方法 」を参照ください。

ZipFile

Lambdaを作成するにあたってZipFileでYamlにインラインでLambdaのコードを書いてデプロイすることができますが、普通そんなことしないと思われます。

S3Bucket,S3Key

LambdaをCloudFormationでデプロイする場合はS3からアップロードするケースが多いと思います。

S3にYamlをアップロードして、Lambda Function自体はzipファイルにしてS3に配置してデプロイすることができます。S3を使用する場合は以下のように指定します。

AWSTemplateFormatVersion: "2010-09-09"
Description : "説明です"
Resources:
  LambdaFunction: # ここはaws:cloudformation:logical-idタグに紐づけられる
    Type: "AWS::Lambda::Function"
    Properties:
      Code:
        S3Bucket: "mybucket"
        S3Key: "lambda.zip"

runtime

Lambdaのランタイムは現時点で指定できるのは以下の通りです。

ランタイム
java8
java11
nodejs10.x
nodejs12.x
python2.7
python3.6
python3.7
python3.8
dotnetcore2.1
go1.x
ruby2.5

Lambda+IAMロールを作成するCloudFormation

長いと読む気になれないですが、簡単なYamlです。

AWSTemplateFormatVersion: "2010-09-09"
Description : "setsumei-des"
Resources:
  LambdaFunctionssss: # 任意
    Type: "AWS::Lambda::Function" # Lambda作成
    Properties:
      Code:
        S3Bucket: "mybucket0165" # S3bucket
        S3Key: "index.zip" # オブジェクトキーとzipファイル名
      FunctionName : "test_lambda_function" # Lambdaファンクション名
      Handler: "index.handler" # インデックスハンドラ
      Role:
        Fn::GetAtt:
          - "LambdaExecutionRoleaaaaaa" # 任意
          - "Arn"
      Runtime: "nodejs12.x" # ランタイム
  LambdaExecutionRoleaaaaaa: # 任意
    Type: "AWS::IAM::Role" # IAMロール作成
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          Effect: "Allow"
          Action: "sts:AssumeRole"
          Principal:
            Service: "lambda.amazonaws.com"

Lambdaのタグを追加するには、Handlerと同じ階層に以下を追記する必要があります。

Tags:
- Key: Name
  Value: "hoge1"

デプロイすると以下のようにタグが追加されているのが確認できます。

AWS CloudFormationでLambdaをデプロイする方法

複数タグ指定する場合は以下のように記述します。

Tags:
- Key: Name
  Value: "hoge1"
- Key: Stage
  Value: "hoge2"
- Key: Owner
  Value: !Ref Stage
ERROR: The request could not be satisfied

CloudFormationのスタックを作成する

CloudFormationのスタックを作成します。

AWS CloudFormationでLambdaをデプロイする方法

「新しいリソースを使用(標準)」を選択します。

AWS CloudFormationでLambdaをデプロイする方法

yamlファイルを選択すると自動でS3にアップロードされるので「次へ」をクリックします。

AWS CloudFormationでLambdaをデプロイする方法

スタック名を入力して「次へ」をクリックします。

AWS CloudFormationでLambdaをデプロイする方法

いくつか進んでいって最後に「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れて「スタックの作成」をクリックします。

AWS CloudFormationでLambdaをデプロイする方法

スタックのイベントに「CREATE_COMPLETE」と出ればLambdaがデプロイされています。

Lambdaの環境変数を設定する

CloudFormationのEnvironmentを使用して環境変数を設定することができます。

こういう事が出来るのでCloudFormationはすごく便利です。

以下のようにPropertiesにEnvironmentを追加してあげます。複数環境変数を指定したい場合はVariablesに複数指定してあげたら良いです。

  LambdaFunction: # 任意
    Type: "AWS::Lambda::Function" # Lambda作成
    Properties:
      Runtime: "nodejs12.x" # ランタイム
      Environment: # 環境変数
        Variables:
          NODE_DEBUG: INFO,WARN # key-valueで設定

X-Rayのアクティブトレースにチェックを入れる

X-Rayをアクティブにしたかったので、CloudFormationで試しました。

インラインポリシーを作って権限を与えます。

      # X-Rayのインラインポリシー追加
      Policies:
        [
          {
            PolicyName: "confrage-xray-lambda-policy",
            PolicyDocument: {
                Version: "2012-10-17",
                Statement: [{
                  Action: ["xray:PutTraceSegments","xray:PutTelemetryRecords"],
                  Effect: Allow,
                  Resource: "*"
                }],
            }
          }
        ]

インラインポリシー一つ作成するのにこのステップは正直長すぎますが、これでインラインポリシーが作成されます。

逆アセンブルしてYamlを吐いてくれる機能などが一部あるようですが詳細な方法は知りません。

Lambda側ではPropertiesに以下2行追加するだけです。

      TracingConfig:
        Mode: "Active"

これでスタック作成すればX-Rayがアクティブになります。

Fn::GetAtt

取りうる値は配列で、属性の値を返します。

属性 戻り値
必要な属性を含むリソースの論理名 リソースの論理名
ARN 関数のARN

2通りの記述方法があります。

      Role:
        Fn::GetAtt:
          - "LambdaExecutionRole"
          - "Arn"

短い書き方です。

      Role:
        !GetAtt "LambdaExecutionRole.Arn"
ERROR: The request could not be satisfied

CloudFormationをCLIで実行する

CLIでスタックを作成することも可能です。

上記のlambda.cf.yamlをダウンロードして、テンプレートファイルとします。

aws cloudformation deployコマンドを使用します。

C:\Users\takahashi-h5>aws cloudformation deploy --profile="default" --template-file "lambda.cf.yaml" --stack-name "hoge" --region "ap-northeast-1" --capabilities CAPABILITY_NAMED_IAM

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - hoge

これでhogeというスタックが作成されて、--template-fileで指定したLambdaも作成されます。

–parameter-overrides

aws cloudformation deployの--parameter-overridesオプションを使うことによって、--template-fileで指定したyaml内の値を動的に指定することが可能になります。

template-fileでパラメータを指定しておく必要があります。

ここではlambda.cf.yamlファイル内に「DeployBucket」というパラメータを指定してみます。

AWSTemplateFormatVersion: "2010-09-09"
Description : "setsumei-des"
Parameters:
  DeployBucket:
    Description: deploy
    Type: String

これで定義が完了です。

パラメータを使う

パラメータを使うには!Ref 変数名とします。

変数名がDeployBucketの場合、!Ref DeployBucketというように書きます。

AWSTemplateFormatVersion: "2010-09-09"
Description : "setsumei-des"
Parameters:
  DeployBucket:
    Description: deploy
    Type: String
Resources:
  LambdaFunctionssss:
    Type: "AWS::Lambda::Function"
    Properties:
      Code:
        S3Bucket: !Ref DeployBucket
        S3Key: "index.zip"

aws cloudformation deployコマンドで--parameter-overridesオプションを追加します。

バケット名はMyBucketとしています。

C:\Users\takahashi-h5>aws cloudformation deploy --profile="default" --template-file "lambda.cf.yaml" --stack-name "hoge" --region "ap-northeast-1" --capabilities CAPABILITY_NAMED_IAM --parameter-overrides DeployBucket=MyBucket

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - hoge

AWS SAMテンプレート

AWS SAMテンプレートを使えばもっと便利です。

aws cloudformation packageコマンド

Roleは!ImportValueで指定する

Roleは!ImportValueを使用して、あらかじめエクスポートに登録しておいたエクスポート値を指定することができます。

lambda.yml

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: This CloudFormation template to create Lambda function

Resources:
  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: 'samplelambda'
      CodeUri: ./aaa.zip
      Handler: index.handler
      Runtime: nodejs16.x
      MemorySize: 128
      Timeout: 15
      Role: !ImportValue LambdaRoleARN

!ImportValueで指定する「LambdaRoleARN」はCloudFormationのエクスポート値にあらかじめ登録されている必要があります。

aws cloudformation packageコマンドです。

aws cloudformation package \
  --template-file lambda.yml \
  --output-template-file lambda_out.yml \
  --s3-bucket <バケット名>

lambda_out.ymlファイルがローカルに作成されます。

aws cloudformation deployコマンドです。

aws cloudformation deploy \
  --template-file ./lambda_out.yml \
  --stack-name <スタック名>

これでLambdaがデプロイされ、あらかじめ作成されたロールをアタッチすることができます。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました