awsdoに ~/.aws/(config|credentials)の設定情報がなくてもAssumeRoleできるようにするためのオプションと、AssumeRoleしたロールでAWSコンソールにログインするオプションを追加した

1年以上前からの久しぶりのアップデートです。

k1low.hatenablog.com

--role-arn --source-profile

複数のAWSアカウントを横断して作業することがあり、AssumeRoleのための設定を~/.aws/(config|credentials)に書くのすら面倒になってきたので、設定なしでAssumeRoleができるようにするためのオプション --role-arn--source-profile を追加しました。

委任元のアカウントAのロール arn:aws:iam::AAAAAAAAAAAAAA:role/example-role を委任先のアカウントBに委任できるようにしている場合、

委任先のアカウントBの設定が ~/.aws/(config|credentials) にある場合は( profile-b )、

$ awsdo --role-arn=arn:aws:iam::AAAAAAAAAAAAAA:role/example-role --source-profile=profile-b -- aws ec2 describe-instance-status

と書けばいいし、アカウントBの設定がなくてもクレデンシャルがあれば

$ env AWS_ACCESS_KEY_ID=BBBBBbbbBBbBb AWS_SECRET_ACCESS_KEY=bbbbBBBbBBBBBBBB awsdo --role-arn=arn:aws:iam::AAAAAAAAAAAAAA:role/example-role -- aws ec2 describe-instance-status

と書けばAssumeRoleをした上でコマンドを実行できます。

設定を書かなくてもAssumeRoleできるということは、シェルスクリプトの一部だったりとかCIで実行したりなどがやりやすくなります。

例えばGitHub Actionsだと以下のようなワークフローでOIDC Connectして認証しながらさらにAssumeRoleしてコマンド実行ができたりします(未検証)。

name: AWS example workflow
on:
  push
permissions:
  id-token: write
  contents: read
jobs:
  assumeRole:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT }}:role/example-role
          aws-region: ${{ secrets.AWS_REGION }}
      - name: Run as ${{ secrets.AWS_ACCOUNT }}
        run: |
          aws sts get-caller-identity
      - name: Setup awsdo
        run: |
          export AWSDO_VERSION=X.X.X
          curl -L https://git.io/dpkg-i-from-url | bash -s -- https://github.com/k1LoW/awsdo/releases/download/v$AWSDO_VERSION/awsdo_$AWSDO_VERSION-1_amd64.deb
      - name: Run as ${{ secrets.AWS_ANOTHER_ACCOUNT }} using awsdo
        run: |
          awsdo --role-arn=arn:aws:iam::${{ secrets.AWS_ANOTHER_ACCOUNT }}:role/another-example-role -- aws sts get-caller-identity

--login

AssumeRoleしたロールでAWSマネジメントコンソール(Web)にログインできるオプションです。

$ AWS_PROFILE=myaws awsdo --login

もともと aws-vault にある機能で、便利だったので実装を参考にして awsdo にも追加しました。

というわけで

どんどんAssumeRoleしていきます。