CircleCI で Severless Framework のデプロイを IAM ロールを使ってクロスアカウントでやる


CircleCI で ServerlessFramework のデプロイを行うときに環境変数で設定した AWS クレデンシャルから別のアカウントにデプロイしたいパターンがあったのでメモ。

別のアカウントのクレデンシャルを CircleCI のコンテキスト使って環境変数に登録してしまえばいいじゃないかとも考えましたが、何個もクレデンシャル登録したくないなーということでスイッチロールでできないかやってみました。

先に結論

試した環境

aws-cli 自体のインストール、 serverless framework は公式 orbs を使っています。

config.yml

aws cli のクレデンシャルに直接スイッチ先の情報を書き込んでいます

config.yml一部抜粋
  "setup credential":
    steps:
      - aws-cli/setup:
          aws-access-key-id: AWS_ACCESS_KEY
          aws-region:AWS_REGION
          aws-secret-access-key: AWS_SECRET_KEY
          profile-name: jump
      - run:
          name: setup credential
          command: |
            echo "[hogehoge]" >> ~/.aws/credentials
            echo "region = {リージョン名}" >> ~/.aws/credentials
            echo "role_arn = {IAM ロール ARN}" >> ~/.aws/credentials
            echo "source_profile = jump" >> ~/.aws/credentials
      - serverless/setup
      - run:
          name: deploy
          command: sls deploy

試してダメだったこと

aws cli の configure set を使う

config.yml の中でジャンプ先のクレデンシャルを作るのに configure set を使ってみましたが、 API キー を空だったり適当な値を入れると sls deploy がエラーになってしまいます。
かと言って、 API キーを登録しないでとりあえずリージョンなど登録してもクレデンシャルが作られず ~/.aws/config の方に書き込まれてしまって、 sls deploy 実行時に「クレデンシャルがないよ!」と怒られてしまいました。

NG例
      - run:
          name: setup credential
          command: |
            aws configure set region {リージョン名} --profile hogehoge
            aws configure set role_arn {IAM ロール ARN} --profile hogehoge
            aws configure set source_profile jump --profile hogehoge
            # 空の API キーは NG でした
            aws configure set aws_access_key_id "" --profile hogehoge
            aws configure set aws_secret_access_key "" --profile hogehoge

サードパーティーの orbs を使う

公式 aws-cli はスイッチロールは対応してませんが、サードパーティーな orbs でこの辺の拡張してたりしないだろうか・・・ということで探してみました。

発見!
https://circleci.com/orbs/registry/orb/appfolio/awscli

それらしいパラメーターもあって良さそう

・・・ただ、 orbs のソースを見てみると

なぜか source_profile に自分自身を設定しているのでスイッチロールできなさそう・・・。

参考

Serverless Frameworkで、IAMロールを利用しクロスアカウントにデプロイする