0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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で実行する方法はあまり見当たらなかったので紹介してみました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?