Open3

Github Actionsで複数AWSアカウントのOIDC認証を設定した

tanakakctanakakc

前提として自分の状況が、S3ホスティング用の主なリソースが設定されているアカウントと、Route53を設定しているアカウントが別になっている。

それぞれをTerraformで管理し、Github Actionsでリソースの更新をしたいという要件。

やりたいことは以下のようなイメージ。

aws-actions/configure-aws-credentials@v4を利用して、OIDC認証を行い、それぞれのアカウントのリソースを管理したかった。

Geminiに相談しつつドキュメントを確認し、以下のようにすることで両アカウントへの認証を行いつつ、Terraformでリソース更新が実現できた。

※ci.ymlの一部抜粋

  - name: "Configure AWS Credentials for Main Account"
    id: main_creds
    uses: aws-actions/configure-aws-credentials@v4
    with:
      role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
      aws-region: ${{ env.MAIN_AWS_REGION }}
      output-credentials: true

  - name: "Configure AWS Credentials for Route53 Account"
    id: route53_creds
    uses: aws-actions/configure-aws-credentials@v4
    with:
      role-to-assume: ${{ secrets.ROUTE53_AWS_ROLE_TO_ASSUME }}
      aws-region: ${{ env.ROUTE53_AWS_REGION }}
      output-credentials: true

  - name: "Setup Terraform Credentials"
    run: |
      # デフォルトプロバイダ用の環境変数 (メインアカウント)
      echo "AWS_ACCESS_KEY_ID=${{ steps.main_creds.outputs.aws-access-key-id }}" >> $GITHUB_ENV
      echo "AWS_SECRET_ACCESS_KEY=${{ steps.main_creds.outputs.aws-secret-access-key }}" >> $GITHUB_ENV
      echo "AWS_SESSION_TOKEN=${{ steps.main_creds.outputs.aws-session-token }}" >> $GITHUB_ENV

      # Route53プロバイダ用の環境変数 (別アカウント)
      echo "TF_VAR_route53_admin_access_key=${{ steps.route53_creds.outputs.aws-access-key-id }}" >> $GITHUB_ENV
      echo "TF_VAR_route53_admin_secret_key=${{ steps.route53_creds.outputs.aws-secret-access-key }}" >> $GITHUB_ENV
      echo "TF_VAR_route53_admin_session_token=${{ steps.route53_creds.outputs.aws-session-token }}" >> $GITHUB_ENV

ポイントは、 output-credentials: trueというオプションで、これがないと認証コマンドの実行結果をoutputsとして利用できなかった。1つ目のアカウントのouput-credentialsオプションは省略できるが、明示的に環境変数を記述している方がわかりやすい気がしたので、両方に設定するようにした。

tanakakctanakakc

Terraformの設定内容とか諸々細かいところもあるけど一旦メモとしてci.ymlの内容だけ書いた

tanakakctanakakc

ローカルでterraform planとか動作確認する時は、2つのアカウントにsso loginをして確認できるような感じにしている