GitHub Actions から CloudFormation をデプロイする

AWS Misc

最近、遅ればせながら GitHub Actions を勉強中です。GitHub 上で作れるパイプラインで、AWS でいうところの CodeBuild や CodePipeline と似たようなことができそうです(よく分かってない)。料金 は、パブリックリポジトリに対しては無料で、プライベートリポジトリでも 500 MB & 2,000 min/month までは無料のようです。無料でこんなことができてよいのでしょうか。

GitHub Actions の強みは、GitHub と統合されているので手間がかからないことや、処理ブロックを Action として再利用できる点が挙げられるようです(参考)。AWS の各サービスと連携するための Action も 公開 されています。

この記事は、その動作確認をした際の作業ログです。


GitHub リポジトリの準備

リポジトリの作成

とりあえず適当なプライベートリポジトリをぽちぽち作成します。

そして clone しておきます。

$ git clone https://github.com/<user-id>/test-cfn.git

シークレットの設定

ワークフロー内から AWS 環境を操作するので、あらかじめ GitHub 側に認証情報をセットしておく必要があります。今回は、リポジトリにシークレットを作成する ことで対応します。

必要なシークレットは以下の 3 つです

  • AWS_ACCESS_KEY_ID : 必要な権限を持つ IAM ユーザーのアクセスキー ID
  • AWS_SECRET_ACCESS_KEY : 必要な権限を持つ IAM ユーザーのシークレットアクセスキー
  • AWS_REGION : 使用するリージョン(ap-northeast-1 とか)

必要なファイルの追加

CloudFormation テンプレート

最小構成でいきます。

Resources:
 SimpleBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: test-s3-detblog

S3 バケットをひとつ作るだけです。

ワークフロー

こちらも最小構成でいきます。ファイルの置き場所に注意です。

name: Deploy CFn Stack

on: push

jobs:
  deploy-cfn:
    name: Deploy CFn Stack to AWS
    runs-on: ubuntu-latest
    steps:

    - name: Checkout
      uses: actions/checkout@v2

    - name: Configure AWS credentials
      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: ${{ secrets.AWS_REGION }}

    - name: Deploy CFn Stack
      uses: aws-actions/aws-cloudformation-github-deploy@v1
      with:
        name: test-cfn-stack
        template: ./template.yml
        no-fail-on-empty-changeset: "1"

ワークフロー構文は ドキュメント を読めば分かりますが、登場した部分についていうと、

on はワークフローを発火させるタイミングを指定します。特定のブランチやパスで push もしくはプルリクが作成された場合、であったり、手動実行、であったりを指定できます。今回は、リポジトリに push されたタイミングで発火するようにします。

jobs は処理のかたまり (job) の集合です。デフォルトでは、各 job は並列で実行されます。今回は、deploy-cfn という job を 1 つだけ定義しています。

deploy-cfn では、実行環境(ランナー。種類によって 料金が異なる)を runs-on で指定し、具体的な手順を steps で指定しています。各 step は、逐次実行されていきます。

Checkout ステップでは、リポジトリの内容をチェックアウトしてきます。checkout アクションを利用します。

Configure AWS credentials ステップでは、AWS 環境の認証情報をセットします。aws-actions/configure-aws-credentials アクションを利用します。with の部分で当該アクションに与える引数を指定するのですが、今回は IAM ユーザーのアクセスキーと使用するリージョンを、先ほど設定したリポジトリのシークレットから与えます。

Deploy CFn Stack ステップでは、CloudFormation のテンプレートをデプロイします。aws-actions/aws-cloudformation-github-deploy アクションを利用します。with としてスタック名とテンプレートへのパスを与えました。なお、no-fail-on-empty-changeset は前回からの差分がなかった時にエラーを出さないようにする設定です(CloudFormation のデフォルトではエラーが出るらしい)。

動作確認

作成した 2 つのファイルを commit して push します。

$ git add .
$ git commit -m "first commit"
$ git push

すると、先ほどのワークフローが自動で実行され(on: push)…、

AWS のコンソールを見てみると、しっかりと S3 バケットが作成されていることが確認できます。

補足:スタックの更新

テンプレートに 2 行(L6,7)追加して push してみます。この追加は、S3 のバージョニングの設定を有効化するものです(デフォルトだと無効になっている)。

Resources:
 SimpleBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: test-s3-detblog
    VersioningConfiguration:
      Status: Enabled

push 後に GitHub を確認すると、2 回目のワークフローが自動で動きはじめてスタックの更新が行われたことが分かります。その後、AWS のコンソールを見てみると、たしかに S3 のバージョニングの設定が有効化されたことを確認できました。

おつかれさまでした。

タイトルとURLをコピーしました