Open7
tfactionsの導入
モノレポで管理できるようtfactionsを導入する。
terraformのcicdツールは他にatlantisなどあるが、決め手は以下の通り。
- github actionsに対応している
- モノレポに対応している
- 専用にサーバを必要としない
チュートリアルが準備してあるので最初の操作感は経験したほうが早い。
導入にあたってやったこと(GCP編)
- Workload Identityの設定
- GitHub APPの設定
- templateの設定
- workflowの設定
- scan(work dirの作成)
- pull request(動作確認)
workload identiryの設定
terraformで実装すると楽ちん
GitHub APPの設定
必要な権限
追加方法
最後にrepoに作成したgithub appのinstallを忘れない
templateの設定
スキャンフォールディングしたときにワーキングディレクトリが自動で作成されます。
その際、templateを設定しておくことで必要なファイル郡が自動でコピーされます。
例えばprovider.tfやbackend.tfなどがコピーされるイメージです。
私はtfaction-getting-startedを参考にしました。
tfaction-root.yamlも必要になります。
tfaction-root.yaml
---
target_groups:
- working_directory: dev
target: dev
gcs_bucket_name_plan_file: 'GCS_BACKET_NAME'
gcs_bucket_name_tfmigrate_history: 'GCS_BACKET_NAME'
template_dir: templates/gcp
terraform_plan_config:
gcp_service_account: terraform-plan@my-project.iam.gserviceaccount.com
gcp_workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
tfmigrate_plan_config:
gcp_service_account: terraform-plan@my-project.iam.gserviceaccount.com
gcp_workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
terraform_apply_config:
gcp_service_account: terraform-plan@my-project.iam.gserviceaccount.com
gcp_workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
tfmigrate_apply_config:
gcp_service_account: terraform-plan@my-project.iam.gserviceaccount.com
gcp_workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider'
次のファイルを準備する
- .github/workflows/*
- aqua/*
tfaction-getting-startedではPersonal Access Tokenを使用するが、推奨はGitHub Appなのでyamlを修正する
apply.yaml
# We recommend using GitHub App Token instead of personal access token,
# but in this getting started let's use personal access token.
- # - name: Generate token
- # id: generate_token
- # uses: tibdex/github-app-token@v1
- # with:
- # app_id: ${{ secrets.APP_ID }}
- # private_key: ${{ secrets.APP_PRIVATE_KEY }}
+ - name: Generate token
+ id: generate_token
+ uses: tibdex/github-app-token@v1
+ with:
+ app_id: ${{ secrets.APP_ID }}
+ private_key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: aquaproj/aqua-installer@v1.1.2
with:
aqua_version: v1.25.0
- uses: suzuki-shunsuke/tfaction/export-secrets@v0.5.19
with:
secrets: ${{ toJSON(secrets) }}
- uses: suzuki-shunsuke/tfaction/setup@v0.5.19
id: setup
with:
- github_app_token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
+ github_app_token: ${{ secrets.steps.generate_token.outputs.token}}
ssh_key: ${{ secrets.TERRAFORM_PRIVATE_MODULE_SSH_KEY }} # This isn't needed if you don't use SSH key to checkout private Terraform Modules
- uses: suzuki-shunsuke/tfaction/tfmigrate-apply@v0.5.19
with:
- github_app_token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
+ github_app_token: ${{ secrets.steps.generate_token.outputs.token}}
- uses: suzuki-shunsuke/tfaction/create-follow-up-pr@v0.5.19
if: failure()
with:
- github_app_token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
+ github_app_token: ${{ secrets.steps.generate_token.outputs.token}}