私の戦闘力は53万です

awsとgcpについて書きます

SAMでgithub actionsを利用する時にIAMユーザを払い出さないで利用したい

f:id:remmemento:20210703211848p:plain
先日こちらでAWS SAMとgithub actionsの連携を試してみました。

cloud-aws-gcp.hateblo.jp

上記利用する際に、IAMユーザとクレデンシャルを払い出す必要がありました。
ただ、諸事情によりIAMユーザを払い出さないで利用したいというケースがありました。
私の環境ではAWS SSOを利用していたため
AWS SSOで一時的なcredentialを取得し、
その一時的なcredentialをgitにsecretとして登録し、
SAMのdeployができないかと考え試してたところ
できたのでブログ化してみました。

設定方法

AWS SSOでcredentialを取得

まずはAWS SSOでcredentialを取得します。 f:id:remmemento:20210721094908p:plain これは、STS等を利用しても取得が可能ですが、
SSOを利用すると1クリックで取得可能なので便利です
上記の「click to... 」の箇所をクリックすればOKです
下記のようなクレデンシャルが取得できると思います。

export AWS_ACCESS_KEY_ID="xxxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxxxx"
export AWS_SESSION_TOKEN="xxxxxxxxxxx"

そして取得した一時credentialを
githubのsecretとして設定します。
そのまま貼り付ければOKでした。 下記の例ではEXPORTSとして登録しています。

f:id:remmemento:20210721095106p:plain

github actionsの設定ファイルを下記のように記載し
pushしたところ正常にdeployができました。
変化点は最後のsam deployのところで、SSOのcredentialを設定した上で、
sam deployを実行しています。

on:
  push:
    branches:
      - master
env:
  stackName: aws-xxxxxxx
  s3BucketName: aws-xxxxxxxxx
  deployRegion: ap-southeast-1
jobs:
  build-deploy:
    runs-on: ubuntu-latest
    steps:
      - run: echo ${{ secrets.DOCKERHUB_TOKEN }} | docker login -u ${{ secrets.DOCKERHUB_USER }} --password-stdin
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: '3.7'
      - uses: aws-actions/setup-sam@v1
      # - 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
      
      # sam build 
      - run: sam build --use-container
      
      # Run Unit tests- Specify unit tests here 
      # - run : pip install -r requirements.txt

      # sam deploy
      - run: ${{ secrets.EXPORTS }} &&  sam deploy --no-confirm-changeset --no-fail-on-empty-changeset --stack-name ${{ env.stackName }} --s3-bucket ${{ env.s3BucketName }} --capabilities CAPABILITY_IAM --region ${{ env.deployRegion }}

使ってみて

上記は一時的なcredentialなので、時間が切れば権限が切れます。
デプロイする都度上記の設定するのは面倒ですが、
一時的なcredentialの時間制限は最大12時間なので、
一回払い出して設定すれば、その日ぐらいは使いまわせると思います。
たまにしか更新しないものであれば、払い出すIAMの管理も面倒だし、
このやり方も一つかなと思いました。
もっと良いやり方があるという方がいらっしゃたら教えて頂けますと嬉しいです。