「MinIOを触ってみた」という記事を書いてから、MinIOをなんかで利用できないかな〜と考えていた。 そんで「GitHub ActionsでMinIOを動かせれば、S3のAPIを利用したアプリケーションのCI/CDで役立つんじゃね?」と思ったので試してみることにした。
MinIOサーバを立てるためのコンテナがDocker Hubにあった
適当にぐぐってみると、同じことを考えている人はいるみたいで、すでにGitHub Actionsで利用することを想定したコンテナが作られていた。 ありがたや〜。
というわけでこれを使うことにする。 Docker Hubを見ながらyamlを書くだけですんなり動いた。
Dockerfileを見ると最新のminioのコンテナを起動するという素直な内容なので、 minioのコンテナをつかってyamlにdocker run
コマンドをベタ書きしても動くはず。
でもせっかく用意されているものがあるのなら使ってみようってことで。
aws-cliを利用してMinIO Serverにリクエストを投げてみる
Actions上でMinIO ServerにPUT/GETができるかも確認しておきたいところ。
ubuntu-latest
ならaws-cliが最初から入ってたりしないかな〜とおもって、ダメ元でyamlを書いたら実行できた。
というわけで最初から入ってるaws-cliを使うことにした。
GitHub Actionsでaws-cliを使うときの注意点
runで実行するコマンドを表現して、envにAWS_ACCESS_KEY_ID
とAWS_SECRET_ACCESS_KEY
を指定すれば動くだろうと思ってたどそんなことはなかった。
調べてみて引っかかった記事がこれ。
GitHub Actions の AWS CLI がエラーで失敗するようになった場合の原因と対策
AWS_DEFAULT_REGION
とAWS_EC2_METADATA_DISABLED: true
も明示する必要があるらしい。
そのとおりに書いたらこのエラーは解消した。
完成品
諸々を経て出来上がったコードがこちら。
name: minio-on-github-actions on: [push] jobs: build: runs-on: ubuntu-latest env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: us-east-1 AWS_EC2_METADATA_DISABLED: true services: minio: image: wktk/minio-server ports: - 9000:9000 env: MINIO_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY_ID }} MINIO_SECRET_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} steps: - name: Add 127.0.0.1 minio to /etc/hosts run: echo "127.0.0.1 minio" | sudo tee -a /etc/hosts - name: make bucket run: aws --endpoint-url http://minio:9000/ s3 mb s3://sample-bucket - name: put object run: echo "sample-key" | aws --endpoint-url http://minio:9000/ s3 cp - s3://sample-bucket/sample/key - name: list objects run: aws --endpoint-url http://minio:9000/ s3 ls s3://sample-bucket/ --recursive
Actionsのログはこちら。 ちゃんとMinIO Serverが利用できていそう。
さいごに
MinIOをGitHub Actionsで活用してみた。MinIOではなくS3をGithub Actionsで利用する場合、バケットやIAMユーザを用意する必要があるだろう。 でもMinIOならそういうのを省いて手軽に利用できるところは大きなメリットだと思った。
今回はaws-cliを併用して検証したけど、 endpoint-urlを明示しておけばAWS SDK for Rubyなどの各APIでも利用できるはず。 自分もS3のAPIを利用できる(だいぶ雑に作った)簡易CLIを作ってるからそのテストで利用しようかな〜。