GitHub ActionsでHCP Terraform No Code Moduleのバージョンを自動更新してみた
GitHubでリリースタグを作成したタイミングで自動的に、HCP TerraformのNo Code Moduleを更新する方法についてです。
HCP Terraform No Code Moduleのバージョンアップ方法
以下を前提とします。
- HCP TerraformでNo Code Moduleを利用
- Git TagベースでModuleのバージョンをPublishする設定
この際、バージョンアップの流れは以下のようになります。
- GitHubリポジトリを更新する(Pull Requestをマージ)
- GitHubでリリースタグを作成する
- HCP Terraform RegistryでNo Code Moduleのバージョンを変更する
「2.」と同時にHCP Terraform Moduleのバージョンも更新されたらいいのですが、現時点では「3.」のステップが必要です。
「2.」ができた時点で、HCP Terraform上からはリリースタグが確認できる状態になります。
最新のバージョンのNo Code Moduleを利用するには、スクショのようにHCP Terraform上でバージョンを変更する必要があります。
「3.」の手順を自動化するGitHub Actionsを作成しました。
GitHub Actionsワークフローファイル
作成したワークフローファイルは以下です。
No Code Moduleリポジトリに以下のファイルを用意します。
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の作成画面に遷移します。
Create a team token
を選択します。
先ほど作成したTeamを選び、Create
を選択します。
デフォルト30日でTokenの有効期限がきれるため、任意でExpiration
は変更します。
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です。
GitHub Actions SecretsとVariablesの登録
GitHubリポジトリにSecretとVariablesを登録します。
GitHubリポジトリ
-> Settings
-> Secrets and variables
-> Actions
の順に選択します。
SecretsにHCP Terraform Tokenを登録します。
New repository secret
を選択します。
以下を設定して、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> |
これで準備完了です。
動作確認(GitHub)
実際にGitHubでリリースタグを作成して、No Code Moduleのバージョンが更新されるか確認します。
GitHub Actionsが実行されました。
HCP TerraformでNo Code Moduleを確認したところ、0.0.23
に更新されていることを確認できました。
おわりに
GitHub Actionsを使ったNo Code Moduleのバージョン更新についてでした。
APIが提供されていたので、割とすんなりできました。
HCP Terraformの機能でピン留めのバージョンを自動更新・手動更新で選べるようになるといいですね。