☁️

HCP Terraform経由でLambdaにnpmのパッケージをインストールする

2025/02/16に公開

余談

Terraform Cloud って、今は HCP Terraform っていう名前に変わってるんですね。

https://www.hashicorp.com/ja/blog/introducing-the-infrastructure-cloud

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に以下の記事があった

https://support.hashicorp.com/hc/en-us/articles/31489038892947-How-to-install-npm-and-other-software-in-the-HCP-Terraform-runtime-environment

ランタイム環境に自力で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一つ管理するくらいならこれくらい許容できるかな、、

Progate Tech Blog

Discussion