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と同じ階層に以下を追記する必要があります。
1 2 3 |
Tags: - Key: Name Value: "hoge1" |
デプロイすると以下のようにタグが追加されているのが確認できます。
複数タグ指定する場合は以下のように記述します。
1 2 3 4 5 6 7 |
Tags: - Key: Name Value: "hoge1" - Key: Stage Value: "hoge2" - Key: Owner Value: !Ref Stage |
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-resource-tags.html
CloudFormationのスタックを作成する
CloudFormationのスタックを作成します。
「新しいリソースを使用(標準)」を選択します。
yamlファイルを選択すると自動でS3にアップロードされるので「次へ」をクリックします。
スタック名を入力して「次へ」をクリックします。
いくつか進んでいって最後に「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れて「スタックの作成」をクリックします。
スタックのイベントに「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" |

cloudformation-lambda
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コマンド
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^