GitHub ActionsとCircleCIでAssume Roleする設定
今回は、以前弊社の西藤がやっていた Terraform用のAWSアクセスキーの権限管理を、スイッチロール形式で最適化する方法 を、CI/CD(Continuous Integration: 継続的インテグレーション/Continuous Delivery: 継続的デリバリー)でよく使われる GitHub Actions と CircleCI でやってみたので、そのまとめです。
スイッチロールを行うメリット
GitHub Actions
や CircleCI
に設定する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 Marketplace で Actions
を検索できるので、そこで 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公式のaws-cliのOrb を使います。
アプリケーションディレクトリ配下に、 .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/setup
で default
の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
とすることで、 example
の profile
を利用しています。
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を使うことで比較的簡単に設定ができました。
どなたかのお役に立てれば幸いです。