🗂
[AWS/GithubActions]スイッチロールで別アカウントと連携する方法
本記事を読み終わった時のゴール
- GithubActionsでAWSアカウントから別のAWSアカウントにスイッチロールして処理を実行出来る事。
前提
- GithubActionsとAWSアカウントの連携については前回記事で解説していますので、以下を参照してください。
本記事ではchain
する部分に絞って記述します。
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
参照
Discussion