CDK For Terraform null providerを利用したい
利用したい経緯としてはLambdaでLayersのビルドを行う際に
CDK For Terraform(以降CDKTF)での実装を行いたいためです。
https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource?lang=typescript
を参照しながら行ったのですが、
試行錯誤が結構必要になったので自身の備忘録的に残しておこうと思います。
元々の運用
言語としてはpython
echo 'psycopg2-binary' > requirements.txt
- LambdaのVerisonが3.9なので3.9にする。
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
とローカルで予めBiildしCDKTFでzip化しアップロードするようにしていました。
最終的なLambdaでの実装方法は別途紹介したいと思います。
null providerを利用する
以下のようにNullProvider
を追記します。
import { Construct } from "constructs";
import { App, TerraformStack } from "cdktf";
import { S3Backend } from 'cdktf';
import { AwsProvider } from "@cdktf/provider-aws/lib/provider";
import * as fs from 'fs';
import * as path from 'path';
import { NullProvider } from '@cdktf/provider-null/lib/provider';
- サンプルコード
AwsProvider同様にNullProviderを追記します。
class MyStack extends TerraformStack {
constructor(scope: Construct, id: string) {
super(scope, id);
// Define AWS provider
new AwsProvider(this, 'aws', {
region: 'ap-northeast-1', // Example: 'us-west-2'
defaultTags: [{
tags: {
environment: id,
IaC: 'cdktf',
}
}]
});
// Nullプロバイダーのインスタンスを追加
new NullProvider(this, 'null', {});
}
}
const app = new App();
new MyStack(app, `${process.env.ENV_ID}`);
app.synth();
null_resourceの実装
変数は利用しておらず、ハードコード祭りになってますが、
requirements.txtのファイルが変更された場合のみ
layerをBuildするようにしています。
import { Construct } from 'constructs';
import * as nul from "@cdktf/provider-null";
export function lambdaSqlExec(scope: Construct,
) {
// null_resourceを使用してDockerビルドとzip作成を実行
new nul.resource.Resource(scope, `LambdaLayerBuild-${id}`, {
triggers: {
on_change: `\${filesha1("./lambda/layers/psycopg2/requirements.txt")}`, // 特定のファイルが変更された場合にのみ実行されます
},
provisioners: [
{
type: 'local-exec',
command: `
docker run -v ./lambda/layers:/var/task "public.ecr.aws/sam/build-python3.12" /bin/sh -c "pip install -r psycopg2/requirements.txt -t lib/python ; exit"`,
},
],
});
}
CDKで実装する場合
こんな感じの実装でいいみたいです。今回はCDKTFで実装する場合にはどうするのがいいのかを
確認してみたかったためnull providerを利用する方式にしましたが、
L2コンストラクトは便利だなと思いました。
const psycopg2Layer = new pyLambda.PythonLayerVersion(this, 'Psycopg2Layer', {
layerVersionName: `sample-psycopg2`,
entry: './lambda/layers/psycopg2',
compatibleRuntimes: [lambda.Runtime.PYTHON_3_12],
});
まとめ
terraformでのnull_resource
を利用する記事はよくみかけるのですが
CDKTFで実行する方法はあまり見当たらなかったので紹介してみました。