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"
デプロイすると以下のようにタグが追加されているのが確認できます。
複数タグ指定する場合は以下のように記述します。
Tags: - Key: Name Value: "hoge1" - Key: Stage Value: "hoge2" - Key: Owner Value: !Ref Stage
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を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がデプロイされ、あらかじめ作成されたロールをアタッチすることができます。

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








コメント