
OpenTacoで複数のAWSアカウントにリソースをデプロイしてみる(AWSプロファイルでIAMロール切替)
OpenTacoを使ったAWSマルチアカウント環境へのリソースデプロイについて解説します。
今回はAWSプロファイルを利用する方法を紹介します。
前提条件
本ブログの検証は以下を前提とします。
- Jump・Prod・Stgの3つのAWSアカウントが存在する
- JumpアカウントにGitHub Actions OIDC用のIAMロールをデプロイ
- ProdとStgアカウントにJumpアカウントのIAMロールが引き受け可能なIAMロールをデプロイ
基本的には以下のブログと同様の構成です。
ディレクトリ構成
├── ./.aws
│ └── ./.aws/config
├── ./.github
│ └── ./.github/workflows/digger-workflow.yml
├── ./digger.yml
├── ./prod
│ └── ./prod/main.tf
├── ./stg
│ └── ./stg/main.tf
└── ./README.md
AWSプロファイル設定ファイル(./aws/config)を作成
GitHub Actions上でAWSプロファイルを利用するために、設定ファイルをGitHubリポジトリに追加します。
リソースデプロイ先アカウントのProdとStgアカウントのプロファイルを設定します。
ここで指定するIAMロールは、Jumpアカウントから引き受けが可能な設定にしておきます。
IAMロールの詳細は冒頭のブログ記事をご確認ください。
[profile prod]
credential_source = Environment
role_arn = arn:aws:iam::0123456789:role/terraform-deploy
[profile stg]
credential_source = Environment
role_arn = arn:aws:iam::1234567890:role/terraform-deploy
providerブロックでAWS Profileを指定
各TerraformコードのProviderブロックでAWSプロファイルを指定します。
terraform.backendブロックでもAWSプロファイル(または引受先IAM Role ARN)を指定する必要があります。
指定しないとJumpアカウント側の認証情報を使ってterraform initを実行することになりエラーになります。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "6.28.0"
}
}
backend "s3" {
bucket = "terraform-state-0123456789" # 環境に合わせて置き換え
key = "terraform.tfstate"
region = "ap-northeast-1"
profile = "prod"
}
}
# 省略
provider "aws" {
region = "us-east-1"
profile = "prod"
}
# 省略
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "6.28.0"
}
}
backend "s3" {
bucket = "terraform-state-123456789" # 環境に合わせて置き換え
key = "terraform.tfstate"
region = "ap-northeast-1"
profile = "stg"
}
}
# 省略
provider "aws" {
region = "us-east-1"
profile = "stg"
}
# 省略
OpenTaco設定ファイルの作成
Terraformコードのあるディレクトリを指定して、プロジェクトを定義します。
projects:
- name: production
dir: prod
- name: staging
dir: stg
GitHub ActionsワークフローファイルにJumpアカウントの認証情報を指定
GitHub Actionsワークフローファイルを定義します。
diggerhq/digger@vLatestアクションのwith.aws-role-to-assumeは引受もとのJumpアカウントのGitHub OIDC用IAMロールを設定します。
AWS_CONFIG_FILEでリポジトリに追加した./aws/configを指定しています。これで./aws/configで設定したAWSプロファイルが利用できます。
name: Digger Workflow
on:
workflow_dispatch:
inputs:
spec:
required: true
run_name:
required: false
run-name: '${{inputs.run_name}}'
jobs:
digger-job:
runs-on: ubuntu-latest
permissions:
contents: write # required to merge PRs
actions: write # required for plan persistence
id-token: write # required for workload-identity-federation
pull-requests: write # required to post PR comments
issues: read # required to check if PR number is an issue or not
statuses: write # required to validate combined PR status
steps:
- uses: actions/checkout@v4
- name: ${{ fromJSON(github.event.inputs.spec).job_id }}
run: echo "job id ${{ fromJSON(github.event.inputs.spec).job_id }}"
- uses: diggerhq/digger@vLatest
with:
digger-spec: ${{ inputs.spec }}
setup-aws: true
setup-terraform: true
terraform-version: 1.14.3
aws-role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
AWS_CONFIG_FILE: ${{ github.workspace }}/.aws/config
動作確認
ProdとStgのそれぞれのディレクトリのファイルを変更したPRを作成しました。
各環境でPlanが成功することを確認できました。

おわりに
OpenTacoを使ったAWSマルチアカウント環境へのリソースデプロイについて解説しました。
AWSプロファイルを活用することで、GitHub Actionsワークフローファイル側の変更を最小限に抑えつつ、複数アカウントへのデプロイが実現できました。
アカウントが増えた場合でも、./aws/configにプロファイルを追加し、対応するTerraformコードとdigger.ymlのプロジェクト定義を追加するだけで対応できます。
関連記事







