🗂

[AWS/GithubActions]スイッチロールで別アカウントと連携する方法

2024/09/16に公開

本記事を読み終わった時のゴール

  • GithubActionsでAWSアカウントから別のAWSアカウントにスイッチロールして処理を実行出来る事。

 

前提

  • GithubActionsとAWSアカウントの連携については前回記事で解説していますので、以下を参照してください。
    本記事ではchainする部分に絞って記述します。

https://zenn.dev/takesaya/articles/github_actions
 

1.GithubActions-AWSアカウント(スイッチ前)の権限設定

参照する側のAWSアカウントで以下内容でIAMポリシーを設定します。

信頼ポリシー

  • ユーザー(認証の対象)となるGithub側へAssumeRoleを許可する。
deploy-github-actions
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::{アカウントID}:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": [
                        "repo:{組織名 or アカウント名}/{リポジトリ名}:*",
                    ]
                }
            }
        }
    ]
}

許可ポリシー

  • スイッチロールする先のアカウントとAssumeRole,Tagsessionを可能にするポリシー
deploy-github-actions
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"s3:*",
				"s3-object-lambda:*"
			],
			"Effect": "Allow",
			"Resource": "*"
		},
		{
            "Sid": "chain",
			"Action": "sts:*",
			"Effect": "Allow",
			"Resource": "arn:aws:iam::{chain先アカウントID}:role/chain_actions"
		}
	]
}

2.AWSアカウント(スイッチ前)-AWSアカウント(スイッチ後)の権限設定

参照される側のAWSアカウントで以下内容でIAMポリシーを設定します。

信頼ポリシー

  • スイッチロールする際の権限を設定
    混乱する代理問題を解消するために一意のIDをConditionで設定する。
chain_actions
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{スイッチ前のアカウントID}:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "{一意のID}"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::{スイッチ前のアカウントID}:root"
            },
            "Action": "sts:TagSession"
        }
    ]
}

許可ポリシー

  • 実際にGithubActionsで処理する内容を設定
    今回もS3のFullAccess権限を付与
chain_actions
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "s3-object-lambda:*"
            ],
            "Resource": "*"
        }
    ]
}

3.GithubActionsのワークフローの記載

  • mainブランチにpushされた際にスイッチロールしてS3バケットの一覧を取得する処理を実行する。
.github/workflows/aws_s3_ls.yml
name: Get to S3 Tokyo Region

on:
  push:
    branches:
      - main
    paths:
      - '.github/workflows/*'
      - '.github/actions/*'
      - '**/*.tf'
  workflow_dispatch:

jobs:
  deploy:
    name: Get from S3 in Tokyo
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      
      - name: Configure AWS credentials via OIDC
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-1 
          role-to-assume: arn:aws:iam::{スイッチロール前のアカウントID}:role/deploy-github-actions 
          role-session-name: GitHubActions_s3_cp 

      - name: Configure other AWS Credentials via SwitchRole
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-1
          role-to-assume: arn:aws:iam::{スイッチロール後のアカウントID}:role/myaccount_actions
          role-external-id: "{一意のID}" # "sts:ExternalId"で指定したID
          role-session-name: GitHubActions_s3_cp2
          role-chaining: true # chainする設定を"true"で指定。

      - name: Get S3bucket
        id: Get
        run: |
          aws s3 ls
        shell:
          bash

参照

https://github.com/aws-actions/configure-aws-credentials

GitHubで編集を提案

Discussion