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"

view raw

gistfile1.txt

hosted with ❤ by GitHub

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"

view raw

gistfile1.txt

hosted with ❤ by GitHub

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

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

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

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

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html

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で設定

view raw

gistfile1.txt

hosted with ❤ by GitHub

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: "*"
}],
}
}
]

view raw

gistfile1.txt

hosted with ❤ by GitHub

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

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

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

TracingConfig:
Mode: "Active"

view raw

gistfile1.txt

hosted with ❤ by GitHub

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

Fn::GetAtt

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

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

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

Role:
Fn::GetAtt:
– "LambdaExecutionRole"
– "Arn"

view raw

gistfile1.txt

hosted with ❤ by GitHub

短い書き方です。

Role:
!GetAtt "LambdaExecutionRole.Arn"

view raw

gistfile1.txt

hosted with ❤ by GitHub

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html

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

view raw

gistfile1.txt

hosted with ❤ by GitHub

これで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

view raw

gistfile1.txt

hosted with ❤ by GitHub

これで定義が完了です。

パラメータを使う

パラメータを使うには!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"

view raw

gistfile1.txt

hosted with ❤ by GitHub

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

view raw

gistfile1.txt

hosted with ❤ by GitHub

AWS SAMテンプレート

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

aws cloudformation packageコマンド

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA