☁️
HCP Terraform経由でLambdaにnpmのパッケージをインストールする
余談
Terraform Cloud って、今は HCP Terraform っていう名前に変わってるんですね。
Terraform Cloud is now HCP Terraform.
簡単サマリ
- Terraform + HCP Terraform で構成管理をしているLambdaがある
- 当初はシンプルな実装だったが、運用の過程でnpmの3rd party packageに依存する処理を書きたくなった
-
terraform_data
を使ってコード変更をトリガーにnpm i
走らせるようにすればいいやろと思っていたけど、そう簡単にはいかなかった - ので、どのように回避したかという話
経緯
terraform_data
経由でLambdaデプロイ時に npm i
してみる
既存のLambda管理用terraformコードに、npm packageをインストールする terraform_data
リソースブロックを追加してみる
resource "terraform_data" "npm_install" {
# npm package.jsonの変更を検知してnpm installを実行
triggers_replace = {
package_json = filemd5("${path.module}/lambda_function/auto_block/package.json")
index_mjs = filemd5("${path.module}/lambda_function/auto_block/index.mjs")
}
provisioner "local-exec" {
working_dir = "${path.module}/lambda_function/auto_block"
command = "npm install"
}
}
これをHCP Terraformでapplyすると以下のエラーが発生
Error running command 'npm install': exit status 127. Output: /bin/sh: 1: npm: not found
実行環境にnpmないのか、それもそうか、と思ったものの、実行環境に関する情報があまり見つからず
ちょっとした処理の追加のためだけにカスタムイメージを作成して運用するのもバランスが悪いな。。と思い知見を回遊していた
公式の見解
HCPのknowledge forumに以下の記事があった
ランタイム環境に自力でnpm実行環境を入れても良さそうだったので、その線で色々試してみた
落ち着いた実装
一旦現状は以下の実装に落ち着いている
resource "terraform_data" "npm_install" {
# package.json と index.mjs の変更を検知して実行する
triggers_replace = {
package_json = filemd5("${path.module}/lambda_function/auto_block/package.json")
index_mjs = filemd5("${path.module}/lambda_function/auto_block/index.mjs")
}
provisioner "local-exec" {
working_dir = "${path.module}/lambda_function/auto_block"
# ref: https://support.hashicorp.com/hc/en-us/articles/31489038892947-How-to-install-npm-and-other-software-in-the-HCP-Terraform-runtime-environment
command = <<-EOH
NODE_VERSION="20.15.1"
wget https://nodejs.org/dist/v$${NODE_VERSION}/node-v$${NODE_VERSION}-linux-x64.tar.xz
tar -xpf node-v$${NODE_VERSION}-linux-x64.tar.xz
export PATH="$(pwd)/node-v$${NODE_VERSION}-linux-x64/bin:$PATH"
npm version
npm install
rm node-v$${NODE_VERSION}-linux-x64.tar.xz
rm -rf node-v$${NODE_VERSION}-linux-x64
EOH
}
}
結構力技ではあるものの、ちょっとしたLambda一つ管理するくらいならこれくらい許容できるかな、、
Discussion