GitHub ActionsでHCP Terraform No Code Moduleのバージョンを自動更新してみた

GitHub ActionsでHCP Terraform No Code Moduleのバージョンを自動更新してみた

Clock Icon2025.06.05

GitHubでリリースタグを作成したタイミングで自動的に、HCP TerraformのNo Code Moduleを更新する方法についてです。

HCP Terraform No Code Moduleのバージョンアップ方法

以下を前提とします。

  • HCP TerraformでNo Code Moduleを利用
  • Git TagベースでModuleのバージョンをPublishする設定

この際、バージョンアップの流れは以下のようになります。

  1. GitHubリポジトリを更新する(Pull Requestをマージ)
  2. GitHubでリリースタグを作成する
  3. HCP Terraform RegistryでNo Code Moduleのバージョンを変更する

「2.」と同時にHCP Terraform Moduleのバージョンも更新されたらいいのですが、現時点では「3.」のステップが必要です。

「2.」ができた時点で、HCP Terraform上からはリリースタグが確認できる状態になります。

最新のバージョンのNo Code Moduleを利用するには、スクショのようにHCP Terraform上でバージョンを変更する必要があります。

Registry___classmethod-sandbox___HCP_Terraform.png

「3.」の手順を自動化するGitHub Actionsを作成しました。

GitHub Actionsワークフローファイル

作成したワークフローファイルは以下です。

No Code Moduleリポジトリに以下のファイルを用意します。

.github/workflows/update-nocode-module.yaml
name: Update HCP Terraform No Code Module

on:
  release:
    types: [published]  # リリースが公開されたときにトリガー

jobs:
  release:
    name: Create Release
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Get release tag name
        id: get_tag
        run: |
          # タグ名の表示
          echo "TAG_NAME=${{ github.event.release.tag_name }}"
      - name: Update Terraform No Code Module
        run: |
          # APIリクエスト用のJSONデータを作成
          cat > payload.json << EOF
          {
            "data": {
              "type": "no-code-modules",
              "attributes": {
                "version-pin": "${{ github.event.release.tag_name }}"
              },
              "relationships": {
                "registry-module": {
                  "data": {
                    "id": "${{ vars.MODULE_ID }}",
                    "type": "registry-module"
                  }
                }
              }
            }
          }
          EOF

          # HCP Terraform APIを呼び出してNo Code Moduleのバージョンを更新
          curl \
            --header "Authorization: Bearer ${{ secrets.HCPTF_TOKEN }}" \
            --header "Content-Type: application/vnd.api+json" \
            --request PATCH \
            --data @payload.json \
            https://app.terraform.io/api/v2/no-code-modules/${{ vars.NO_CODE_MODULE_ID }}

リリースタグが作成されたタイミングで、No Code Moduleのバージョンを更新するというものです。

HCP TerraformはAPIが用意されており、今回は以下のAPIを利用することでNo Code Moduleの設定を更新しました。

/no-code-modules API reference for HCP Terraform | Terraform | HashiCorp Developer

以下をGitHubリポジトリにSecretsやVariablesとして登録する必要があります。

次のステップで設定していきます。

  • No Code Module ID
  • Module ID
  • HCP Terraform Token

HCP Terraform Tokenの作成

HCP Terraform API利用のために、HCP Terraform Tokenを用意します。

Token用にPrivate Registryの更新が可能な、Teamを作成します。

HCP Terraform -> Settings -> Teams -> Create Teamの順に選択します。

Team nameは任意の名前を設定します。(私はno-code-module-updateとしました)

Manage modulesにチェックを入れます。Update team organization accessを選択して、設定を反映します。

Go to API Tokensを選択して、Tokenの作成画面に遷移します。

Team___no-code-module-update___classmethod-sandbox___HCP_Terraform.png

Create a team tokenを選択します。

先ほど作成したTeamを選び、Createを選択します。

デフォルト30日でTokenの有効期限がきれるため、任意でExpirationは変更します。

Cursor_と_alXRPbIoOY89_png__2188×1384_.png

Tokenが表示されますので、値を控えておきます。

No Code Module IDとModule IDの確認

TOKENをコンソールにセットします。

TOKEN="<前の手順で作成したHCP Terraform Team Token>"

以下のコマンドでIDを確認できます。Org名やModule名は環境に合わせて、入力してください。

HCPTF_ORG_NAME=""
MODULE_NAME=""
PROVIDER_NAME=""
curl \
  --request GET \
  --header "Authorization: Bearer $TOKEN" \
  --header "Content-Type: application/vnd.api+json" \
  https://app.terraform.io/api/v2/organizations/$HCPTF_ORG_NAME/registry-modules/private/$HCPTF_ORG_NAME/$MODULE_NAME/$PROVIDER_NAME | \
  jq '{module_id: .data.id, nocode_id: .data.relationships."no-code-modules".data[0].id}'
{
  "module_id": "mod-XXXXX",
  "nocode_id": "nocode-YYYYY"
}

こちらのIDも次の手順で使うため、控えておいてください。

(任意)actを使ってローカルで動作確認

actを使ってローカルでGitHub Actionsの動作を確認します。

以下のコマンドを実行して、ファイルを用意します。

# .secrets ファイルの作成
echo "HCPTF_TOKEN=your_token_here" > .secrets

# .env ファイルの作成
# 各種MODULE_IDはリポジトリのVariablesから確認できます
cat > .env << EOF
MODULE_ID=mod-XXXXXXXXXXXX
NO_CODE_MODULE_ID=nocode-XXXXXXXXXXXX
EOF

actでWorkflowファイルの内容を実行します。

TAG_NAME="0.0.20"

# actを実行
act release \
  --eventpath <(echo "{\"release\":{\"tag_name\":\"$TAG_NAME\"}}") \
  --secret-file .secrets \
  --var-file .env \
  --container-architecture linux/amd64
出力例
[Update HCP Terraform No Code Module/Create Release] ⭐ Run Set up job
[Update HCP Terraform No Code Module/Create Release] 🚀  Start image=catthehacker/ubuntu:act-latest
[Update HCP Terraform No Code Module/Create Release]   🐳  docker pull image=catthehacker/ubuntu:act-latest platform=linux/amd64 username= forcePull=true
[Update HCP Terraform No Code Module/Create Release] using DockerAuthConfig authentication for docker pull
[Update HCP Terraform No Code Module/Create Release] pulling image 'docker.io/catthehacker/ubuntu:act-latest' (linux/amd64) failed with credentials Error response from daemon: Head "https://registry-1.docker.io/v2/catthehacker/ubuntu/manifests/act-latest": unauthorized: incorrect username or password retrying without them, please check for stale docker config files
[Update HCP Terraform No Code Module/Create Release]   🐳  docker create image=catthehacker/ubuntu:act-latest platform=linux/amd64 entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host"
[Update HCP Terraform No Code Module/Create Release]   🐳  docker run image=catthehacker/ubuntu:act-latest platform=linux/amd64 entrypoint=["tail" "-f" "/dev/null"] cmd=[] network="host"
[Update HCP Terraform No Code Module/Create Release]   🐳  docker exec cmd=[node --no-warnings -e console.log(process.execPath)] user= workdir=
[Update HCP Terraform No Code Module/Create Release]   ✅  Success - Set up job
[Update HCP Terraform No Code Module/Create Release] ⭐ Run Main Get release tag name
[Update HCP Terraform No Code Module/Create Release]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/get_tag] user= workdir=
| TAG_NAME=0.0.20
[Update HCP Terraform No Code Module/Create Release]   ✅  Success - Main Get release tag name [114.815542ms]
[Update HCP Terraform No Code Module/Create Release] ⭐ Run Main Update Terraform No Code Module
[Update HCP Terraform No Code Module/Create Release]   🐳  docker exec cmd=[bash -e /var/run/act/workflow/1] user= workdir=
[Update HCP Terraform No Code Module/Create Release]   ✅  Success - Main Update Terraform No Code Module [2.759559834s]
[Update HCP Terraform No Code Module/Create Release] ⭐ Run Complete job
[Update HCP Terraform No Code Module/Create Release] Cleaning up container for job Create Release
[Update HCP Terraform No Code Module/Create Release]   ✅  Success - Complete job
[Update HCP Terraform No Code Module/Create Release] 🏁  Job succeeded

HCP Terraform上でModuleバージョンが変わっていればOKです。

classmethod-sandbox_landing-zone_tfe___Registry___classmethod-sandbox___HCP_Terraform.png

GitHub Actions SecretsとVariablesの登録

GitHubリポジトリにSecretとVariablesを登録します。

GitHubリポジトリ -> Settings -> Secrets and variables -> Actionsの順に選択します。

Actions_secrets_·_classmethod-aws_terraform-tfe-landing-zone.png

SecretsにHCP Terraform Tokenを登録します。

New repository secretを選択します。

Actions_secrets_·_classmethod-aws_terraform-tfe-landing-zone.png

以下を設定して、Add secretを選択します。

Name Secert
HCPTF_TOKEN <作成したHCP Terraform Token>

同様にVariablesも設定します。

Variables -> New Repository variableを選択します。

以下を設定して、Add Variableを選択します。

Name Value
MODULE_ID <前の手順で確認したModule ID>
NO_CODE_MODULE_ID <前の手順で確認したNo Code Module ID>

Actions_variables_·_classmethod-aws_terraform-tfe-landing-zone.png

これで準備完了です。

動作確認(GitHub)

実際にGitHubでリリースタグを作成して、No Code Moduleのバージョンが更新されるか確認します。

New_release_·_classmethod-aws_terraform-tfe-landing-zone.png

GitHub Actionsが実行されました。

0_0_23_·_classmethod-aws_terraform-tfe-landing-zone_6aff885.png

HCP TerraformでNo Code Moduleを確認したところ、0.0.23に更新されていることを確認できました。
classmethod-sandbox_landing-zone_tfe___Registry___classmethod-sandbox___HCP_Terraform.png

おわりに

GitHub Actionsを使ったNo Code Moduleのバージョン更新についてでした。

APIが提供されていたので、割とすんなりできました。

HCP Terraformの機能でピン留めのバージョンを自動更新・手動更新で選べるようになるといいですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.