こんにちは、IaCお姉さんです。
CloudFormationにIaC ジェネレーターという新しい機能が出たので使っていきます。
IaC ジェネレーターについては、以下の公式ページをご覧ください。
今回はLambda関数をIaC化します。
コンソールからLambda関数を作成
言語はPythonを選んで、デフォルトのソースコードのまま作成しました。
CloudFormation IaCジェネレーターでテンプレートを作成
コンソールのIaCジェネレーターから「テンプレート作成」をクリックし、今回作ったLambda関数を選択し、テンプレートを作成します。
できたテンプレートがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
--- Metadata: TemplateId: "arn:aws:cloudformation:ap-northeast-1:999999999999:generatedTemplate/hoge" Parameters: LambdaFunction00iacgentest00hDmeyCodeS3BucketOneOftEfZZ: NoEcho: "true" Type: "String" Description: "An Amazon S3 bucket in the same AWS Region as your function. The\ \ bucket can be in a different AWS account.\nThis property can be replaced with\ \ other exclusive properties" LambdaFunction00iacgentest00hDmeyCodeS3KeyOneOfI1FJJ: NoEcho: "true" Type: "String" Description: "The Amazon S3 key of the deployment package.\nThis property can\ \ be replaced with other exclusive properties" Resources: LambdaFunction00iacgentest00hDmey: UpdateReplacePolicy: "Retain" Type: "AWS::Lambda::Function" DeletionPolicy: "Retain" Properties: MemorySize: 128 Description: "" TracingConfig: Mode: "PassThrough" Timeout: 3 RuntimeManagementConfig: UpdateRuntimeOn: "Auto" Handler: "lambda_function.lambda_handler" Code: S3Bucket: Ref: "LambdaFunction00iacgentest00hDmeyCodeS3BucketOneOftEfZZ" S3Key: Ref: "LambdaFunction00iacgentest00hDmeyCodeS3KeyOneOfI1FJJ" Role: "arn:aws:iam::999999999999:role/service-role/iac-gen-test-role-tzzzpewe" FileSystemConfigs: [] FunctionName: "iac-gen-test" Runtime: "python3.12" PackageType: "Zip" LoggingConfig: LogFormat: "Text" LogGroup: "/aws/lambda/iac-gen-test" EphemeralStorage: Size: 512 Architectures: - "x86_64" |
テンプレートを手直しする
テンプレートを作成するとこのような画面になります。
黄色い枠の中にwarningが出ています。
1 |
The template contains properties that can be replaced with other mutually exclusive properties. Additionally, some optional properties were not included. You can download the template and edit it to modify the properties to suit your needs. |
「このテンプレートはまだ未完成だから自分でなんとかしてね」と言っています。
「View warning details」をクリックしてみると、どうやら「Code/S3Bucket」と「Code/S3Key」は自分で値を用意しないといけないようです。
CloudFormationでLambda関数を作成する際、コードのアップロード方法として、以下の3種類があります。
- S3からアップロード
- ECRのイメージとしてアップロード
- zipファイルをアップロード
ですが、IaCジェネレーターから既存のLambda関数のテンプレートを作成する時に、コードがどうやってアップロードされたかは検知できず、「Code」部分にはS3からアップロードした場合のソースが作成されるようです。
(ECRイメージの関数もテンプレート化してみましたが、同様に「Code/S3Bucket」と「Code/S3Key」のパラメータでテンプレートが生成されました。)
テンプレートを実際に使う時は、適宜アップロード方法を書き換えないといけません。
詳細はこちらのドキュメントを参照
今回は、凝ったことはせずzipファイルでアップロードするようにテンプレートを書き換えます。
Lambda関数の画面からコードをコピーして、テンプレートの「Code」部分に貼り付けます。
1 2 3 4 5 6 7 8 9 10 |
Code: ZipFile: | import json def lambda_handler(event, context): # TODO implement return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') } |
インポートする
テンプレートが完成したら、インポートして、リソースをCloudFormationの管理下に置きます。
画面の「Import edited template」から、先ほど「Code」部分を編集したファイルをアップロードしてインポート完了です。
まとめ
IaCジェネレーター、とっても便利なので皆さんも使ってみましょう^ヮ^
ただし、一部のリソースではテンプレート作成後に人力で修正を加えないといけないようです。