GitHub ActionsとCircleCIでAssume Roleする設定

GitHub ActionsとCircleCIでAssume Roleする設定

今回は、以前弊社の西藤がやっていた Terraform用のAWSアクセスキーの権限管理を、スイッチロール形式で最適化する方法 を、CI/CD(Continuous Integration: 継続的インテグレーション/Continuous Delivery: 継続的デリバリー)でよく使われる GitHub ActionsCircleCI でやってみたので、そのまとめです。

スイッチロールを行うメリット

GitHub ActionsCircleCI に設定するAWSのアクセスキーには、スイッチロール(Assume Role)するためだけの最低限の権限のみとすることで、万が一何らかの理由でアクセスキーが漏洩してしまっても、影響範囲を最低限にできることがメリットとして考えられます。

事前準備(IAMユーザー、ロール作成)

IAMユーザーの作成やスイッチロールの作成方法については前述の西藤のブログ記事に詳細がありますので、今回は割愛します。

今回は、

  • IAMユーザーを gene-test-user
  • スイッチするロールを gene-test-role

として作成しました。

GitHub Actions

Secrets 設定

まずは、GitHubへAWSアクセスキーの設定を行います。

GitHubのリポジトリの Settings -> Secrets -> New repository secret の順に画面遷移し、

今回使うIAMユーザーのAWSアクセスキーなどを設定していきます。

設定したのは下記3つです。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_ROLE_TO_ASSUME

AWS_ROLE_TO_ASSUME にはスイッチするロールのARNを入力します。
arn:aws:iam::111111111111:role/gene-test-role のような形です。

ymlファイルの設定

GitHub MarketplaceActions を検索できるので、そこで aws と入力します。

検索結果の中から画像の

を使って設定していきます。

アプリケーションディレクトリ配下に、 .github/workflows/ というディレクトリを作成して、そこに switch-role-test.yml というymlファイルを作成します。

switch-role-test.yml の設定内容は下記のとおりです。

name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - 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
      - run: aws sts get-caller-identity

      - name: Set AWS_ROLE_TO_ASSUME
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
          role-duration-seconds: 900
          role-skip-session-tagging: true
          aws-region: ap-northeast-1
      - run: aws sts get-caller-identity

${{ secrets.AWS_ACCESS_KEY_ID }} のように設定することで、先程設定したSecretsを利用することができます。

ロールをスイッチする前後でわかりやすいように、 aws sts get-caller-identity コマンドで、現在使っている認証情報を表示してみました。

実行結果

実行した結果の画像です。

スイッチする前は、 aws sts get-caller-identity の結果が、 gene-test-user となっていて、スイッチ後には、スイッチしたロール gene-test-role が確認できるかと思います。

CircleCI

環境変数設定

CircleCI の方も環境変数としてAWSアクセスキーなどを設定していきます。

Project Settings -> Environment Variables -> Add Environment Variable で設定できます。

設定したのは下記4つです。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_ROLE_TO_ASSUME
  • AWS_DEFAULT_REGION

ymlファイルの設定

アプリケーションディレクトリ配下に、 .circleci ディレクトリを作成し、その配下に config.yml を作成します。

config.yml の設定内容は下記のとおりです。

version: '2.1'
orbs:
  aws-cli: circleci/aws-cli@2.0.6
jobs:
  aws-cli-example:
    executor: aws-cli/default
    steps:
      - checkout
      - aws-cli/setup

      - run: aws sts get-caller-identity

      - run:
          command: |
            aws --profile example configure set role_arn $AWS_ROLE_TO_ASSUME
            aws --profile example configure set source_profile default

      - run: aws --profile example sts get-caller-identity
workflows:
  aws-cli:
    jobs:
      - aws-cli-example

aws-cli/setupdefault のAWS設定を行っております。最初に設定した環境変数(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION) が利用されます。

その後、

aws --profile example configure set role_arn $AWS_ROLE_TO_ASSUME
aws --profile example configure set source_profile default

の2行で example という名の profile の設定を行い、その中でスイッチするロール(AWS_ROLE_TO_ASSUME)の設定も行っています。

設定後に、確認のため aws sts get-caller-identity を実行しているのですが、明示的に --profile example とすることで、 exampleprofile を利用しています。

aws --profile example sts get-caller-identity

実行結果

実行結果の画像です。

こちらも同様にスイッチする前は、 aws sts get-caller-identity の結果が、 gene-test-user となっていて、スイッチ後には、スイッチしたロール gene-test-role が確認できるかと思います。

まとめ

今回は、GitHub ActionsとCircleCIでスイッチロールするやり方をまとめてみました。
GitHub Marketplaceで公開されているActionsや、CircleCI公式のOrbを使うことで比較的簡単に設定ができました。
どなたかのお役に立てれば幸いです。