
OpenTacoで複数のAWSアカウントにリソースをデプロイしてみる
OpenTacoを使って複数のAWSアカウントにリソースをデプロイする方法はいくつかあります。
今回はdigger.ymlを使う方法についてです。
この方法はdigger.yml内でaws_role_to_assumeフィールドを使って引き受けるIAM Roleを指定します。
前提条件
本ブログの検証は以下を前提とします。
- STGとPRODのAWSアカウントが存在する
- 各AWSアカウントには、GitHub Actions OIDC用のIAMロールをデプロイ済み
サンプルコード
ディレクトリ構成は以下です。
├── ./.github
│ └── ./.github/workflows/digger-workflow.yml
├── ./digger.yml
├── ./prod
│ └── ./prod/main.tf
├── ./stg
│ └── ./stg/main.tf
└── ./README.md
TerraformコードはEC2を作成するものを用意しました。
以下はPROD環境のコードで、STG環境もBackendのS3バケット名以外は同一の状態にしました。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "6.28.0"
}
}
backend "s3" {
bucket = "terraform-state-XXXXXX"
key = "digger/quickstart-actions-aws/terraform/state"
region = "ap-northeast-1"
}
}
provider "aws" {
region = "us-east-1" # Replace with your desired AWS region
}
resource "aws_vpc" "vpc_network" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "terraform-network"
}
}
resource "aws_subnet" "vpc_subnet" {
vpc_id = aws_vpc.vpc_network.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
map_public_ip_on_launch = true
tags = {
Name = "terraform-subnet"
}
}
resource "aws_security_group" "security_group" {
vpc_id = aws_vpc.vpc_network.id
name_prefix = "terraform-"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "vm_instance" {
ami = "ami-05c13eab67c5d8861" # us-east-1 Amazon Linux 2023 AMI 2023.2.20231030.1 x86_64 HVM kernel-6.1
instance_type = "t2.micro"
subnet_id = aws_subnet.vpc_subnet.id
vpc_security_group_ids = [aws_security_group.security_group.id]
tags = {
Name = "terraform-instance"
}
}
digger.ymlファイルにAWSアカウント毎にprojectを定義
STGとPRODのAWSアカウントごとにProjectを定義して、それぞれのアカウントにあるGitHub Actions用のIAMロールを設定しました。
projects:
- name: production
dir: prod
aws_role_to_assume:
command: "arn:aws:iam::1234567890:role/github-actions-role"
- name: staging
dir: stg
aws_role_to_assume:
command: "arn:aws:iam::2345678901:role/github-actions-role"
OpenTaco用のGitHub Actions Workflowファイルを修正
digger.yml内でIAMロールを指定しているため、GitHub Actionsワークフローファイル内ではIAMロールを指定する必要はありません。
setup-aws: trueの状態だと、IAMロールやAWSアクセスキーを使ってAWS認証情報を設定します。
IAMロールかAWSアクセスキーを指定していないと、AWS認証情報がセットできずにワークフロー実行がエラーになります。
IAMロールの指定を消したため、setup-aws: falseにします。
ちなみに、ここでsetup-aws:true aws-role-to-assume: <IAM Role ARN>にした場合でもdigger.ymlの設定に従いそれぞれのプロジェクトでIAMロールの引受が行われます。
設定をシンプルにするために、aws-role-to-assume: <IAM Role ARN>削除・setup-aws:falseにしています。
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: false
setup-terraform: true
terraform-version: 1.14.3
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
動作確認
STG環境・PROD環境それぞれのTerraformファイルに変更を加えてPull Requestを作成しました。
digger applyコメントを実行して、Applyを行いました。
STGとPRODそれぞれのAWSアカウントにリソースが作成されました。

$ aws ec2 describe-instances --profile prod --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType]' --output table
------------------------------------------------
| DescribeInstances |
+----------------------+----------+------------+
| i-01XXXXXXXXXXX | running | t2.micro |
+----------------------+----------+------------+
$ aws ec2 describe-instances --profile stg --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType]' --output table
------------------------------------------------
| DescribeInstances |
+----------------------+----------+------------+
| i-09XXXXXXXXXXX | running | t2.micro |
+----------------------+----------+------------+
おわりに
OpenTacoのdigger.ymlを使った複数AWSアカウントへのデプロイについて紹介しました。
aws_role_to_assumeフィールドを使うことで、プロジェクトごとに異なるAWSアカウントのIAMロールを指定できるため、環境分離が容易に実現できます。
他の方法についても検証してブログにしたいと思います。







