dehio3’s diary

仕事、生活、趣味のメモ

Github ActionsでAssumeRoleする方法

f:id:dehio3:20200219183236p:plain

はじめに

ローカル端末から実施していたServerless FrameworkでのLambdaのdeployをGitHubActionsに移行したらAssumeRoleの処理で詰まったので備忘録です。

ローカルでのデプロイ方法

複数のAWSアカウントを持ってるので、以下を参考にIAMユーザーには権限を持たせず、AssumeRoleを利用して各AWS環境のRoleにスイッチロールしてアクセスをしてます。

dev.classmethod.jp

その為、デプロイする時は対象のAWSアカウント用のProfileを指定してデプロイを実行しています。

$ AWS_PROFILE=aws-test sls deploy --verbose

~/.aws/credentials

 [default]
aws_access_key_id = ****************
aws_secret_access_key = *****************************************
[aws-test]
role_arn = arn:aws:iam::<AcountID>:role/assume-role
source_profile = default

AssumeRoleの実行方法

AWSのブログ「GitHub Actions と AWS CodeBuild テストを使用して Amazon ECS の CI/CD パイプラインを作成する」にも紹介されている、以下の公式のActionを利用してAsume Roleを実行します。

github.com

GitHub Actionsの設定

READMEの記載を参考に以下を定義します。
AssumeRoleのARNもsecretsから取得するようにしてます。

- name: Configure AWS Credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ap-northeast-1
    role-to-assume: ${{ secrets.AWS_ASSUME_ROLE_ARN }}
    role-duration-seconds: 1200

secretsには~/.aws/credentialsと同じ値を設定します。

.github/workflows/deploy.yml

GitHub Actionsの実行

そのまま実行するとConfigure AWS Credentialsのステップにて以下のエラーで失敗します。

##[error]User: arn:aws:iam::<AcountID>:user/<IAM User Name> is not authorized to perform: sts:TagSession on resource: ***
##[error]Node run failed with exit code 1

原因

Actionの処理を確認すると以下の様にAssumeRoleする際にセッションタグを渡していました。
(普段使ってないのでセッションタグの存在を初めて知りました。)

configure-aws-credentials/index.js at master · aws-actions/configure-aws-credentials · GitHub

対応

セッションタグの説明のセッションタグの追加に必要なアクセス許可に記載の通り、接続先のロールの信頼ポリシーにセッションタグへのアクセスを許可する必要があります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<AcountID>:root"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"  # "sts:TagSession"をActionに追加する
      ],
      "Condition": {}
    }
  ]
}

ロールを作成する時に、コンソールから「信頼されたエンティティの種類」で「別のAWSアカウント」を指定して作成すると、sts:AssumeRoleしか許可しない為、一旦作成後に信頼ポリシーを編集して追加する必要があります。

接続元のアカウントではなく、接続先のアカウントのロールに設定が必要なので注意です。
(接続元のアカウント側で対応してて、小一時間ハマってしまいました・・・)