GithubActionsでaws-nukeを定期実行する

2022.07.06

「GithubActionsでaws-nukeを定期実行したい。」

AWSリソースの一括削除に便利なaws-nukeですが、定期実行できたらさらに便利ですよね。

今回は、GithubActions上でaws-nukeを定期実行する方法を紹介します。

やってみた

フォルダ構成

.
├── .github
│   └── workflows
│       └── aws-nuke-run.yaml # aws-nukeをGithubActions上で実行する
├── docker-compose.yml 
└── nuke-config.yml #aws-nuke用のconfigファイル

IAMロールを作成

GithubActionsからAWSリソースを作成するために、IAMロールを作成します。

IAMロールの権限は、削除したいリソースによって変わります。

私はIAMユーザーなども削除したかったため、AdministratorAccessのポリシーを付与しました。

IAMロールの作成は、以下が参考になるかと思います。

AWS CDKを使用している場合は、以下の手順でできます。

nuke-config.ymlの作成

aws-nuke用のconfigファイルを用意します。 今回はSQS Queueのみ削除するconfigファイルを用意しました。

nuke-config.yml

---
regions:
- ap-northeast-1
- global
account-blocklist:
- 000000000
resource-types:
  targets:
  - SQSQueue # SQSQueueのみ削除される
accounts:
  1234567890: {}

aws-nukeの設定などについては、こちらの記事で触れています。

docker-compose.ymlの作成

GithubActions上でdocker runでaws-nukeのコンテナ起動してもいいのですが、コマンドを短くするためにdocker-compose.ymlを使用します。

docker-compose.yml

version: "3"
services:
  aws-nuke:
    image: rebuy/aws-nuke:latest
    entrypoint: /usr/local/bin/aws-nuke --config /home/aws-nuke/config.yml --force --quiet
    volumes:
      - ./nuke-config.yml:/home/aws-nuke/config.yml
      - ~/.aws:/home/aws-nuke/.aws
    environment:
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_SESSION_TOKEN

以下のように、ローカル実行する際にも短いコマンドで実行できて便利です。

$ export AWS_ACCESS_KEY_ID=<アクセスキー>
$ export AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
$ export AWS_SESSION_TOKEN=<セッショントークン>
# docker-compose使用
$ docker compose run aws-nuke
# 直接docker run
$ docker run \
    --rm -it \
    -v /full-path/to/nuke-config.yml:/home/aws-nuke/config.yml \
    -v /home/user/.aws:/home/aws-nuke/.aws \
    quay.io/rebuy/aws-nuke:latest \
    --config /home/aws-nuke/config.yml

.github/workflows/aws-nuke-run.yamlの作成

aws-nuke用のワークフローファイルです。 今回はサンプル用に毎時0分に実行します。

name: aws-nuke-run

on:
  schedule:
    - cron: '0 * * * *'

jobs:
  run_aws_nuke:
    name: Run aws-nuke
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME_TEST }}
          aws-region: ap-northeast-1

      - name: Run aws-nuke
        run: docker compose run aws-nuke --no-dry-run

nuke run

おわりに

GithubActions上でaws-nukeを定期実行する方法の紹介でした。

他にもpush時や手動トリガー(workflow_dispatch)でdry-runを実行させたりすると便利かもしれません。

ワークフローをトリガーするイベント - GitHub Docs

以上、AWS事業本部の佐藤(@chari7311)でした。