2022.06.24  

【GitHub Actions】AWSへのTerraform applyを自動化する

Terraform,  Git    

GitHub ActionsでTerraformを使用し、AWS環境に対して自動でterraform fmt -check ``terraform init``terraform plan``terraform applyを実行する方法についてメモ書きします。

GitHub Actionsを利用する方法

作成中のプロジェクトの.github/workflows配下にymlファイルを作成し、その中にGitHub Actionsの実行条件や内容を記載することで利用できます。

ymlファイル配置先

<プロジェクト名>/.github/workflows/<任意の名前>.yml

GitHub ActionsからAWSにアクセスする

あるAWSユーザーでGitHub ActionsからAWSにアクセスするには、workflowsのymlファイルに次のような設定を行います。
secrets.変数GitHub GUI上のリポジトリ -> Settings -> Environmentsで設定できる

      - 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: ap-northeast-1

ただ、使用するユーザーがMFAによる認証を必要としていたり、セキュリティ上、上記の設定が利用できない場合、OIDCを利用した接続設定を行う必要があります。

今回はOIDC を利用して設定を進めていきます。

OIDCの設定

この章では、GitHub Actions OIDCでAssumeRoleする設定を行います。参考

まずIDプロバイダを作成を作成します。

それぞれ次のように設定します。

プロバイダのタイプ: OpenIDConnect
プロバイダのURL: https://token.actions.githubusercontent.com
対象者: sts.amazonaws.com

次にIAMロールを作成します。
IAM -> ロール -> ロールの作成 -> カスタム信頼ポリシーをクリックします。

カスタム信頼ポリシー欄を次のように記載します。

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::{AWS_ACCOUNT_ID}:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:{GITHUB_ORG_NAME}/{GITHUB_REPO_NAME}:*"
        }
      }
    }
  ]
}

{ 変数 }の部分はそれぞれの環境にあった値に書き換えます。

{AWS_ACCOUNT_ID}部分には先ほど作成したIDプロバイダのアカウントIDを設定します。

アカウントIDは IAM -> ID プロバイダ -> <先ほど作成したIDプロバイダ> -> ARN 欄にある12桁の数字です。

{GITHUB_ORG_NAME}/{GITHUB_REPO_NAME}はGithubにGUIで作業対象のレポジトリにアクセスすると、URLに設定値が表示されるのでそちらを設定します。

https://github.com/<GITHUB_ORG_NAME}>/<GITHUB_REPO_NAME>

設定ができたら次へボタンを押します。

次の画面で許可ポリシーの設定を行います。
使用したいポリシーが決まっていればそちらを設定します。
まだ決まっていなければひとまず、AdministratorAccessを設定しておきます。

設定ができたら次へボタンを押します。

次の画面でロール名 を設定してロールの作成ボタンを押下します。

これでOIDCの設定は完了です。

作成が完了したらIAM -> ロール -> <今回作成したロール名>をクリックし、ARNの値をメモします。

GitHub ActionsでAWSへ接続できるか確認

コード上の<プロジェクト名>/.github/workflows/<任意の名前>.ymlに移動し、次のような設定を行います。

<作業ブランチ名>には現在作業しているブランチ名、
<作成したOIDC IAMロールのARN>には先ほどメモしたARNの値を設定します。

name: AWS Deploy
on:
  push:
    branches:
      - <作業ブランチ名>

env:
  AWS_ROLE_ARN: <作成したOIDC IAMロールのARN>

permissions:
  id-token: write
  contents: read
jobs:
  aws-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1
      - run: aws sts get-caller-identity

こちらをcommit -> push した後、GitHubのサイト-> 作業レポジトリ -> Actionsを確認してエラーとなっていなければOIDCの設定は上手くいっています。

GitHub ActionsでTerraformを実行する

ymlファイルを次のように設定して、ブランチをcommit -> pushすると自動でterraform fmt -check ``terraform init``terraform plan``terraform applyが実行されます。
< >の箇所はご自身の環境に合うように修正してください。

name: <任意のAction名>
on:
  push:
    branches:
      - prototype

env:
  TF_VERSION: 1.1.2
  AWS_ROLE_ARN: <作成したOIDC IAMロールのARN>
  AWS_DEFAULT_REGION: ap-northeast-1

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    # environmentはgithub上でsetting -> environmentの設定をしていない場合は不要
    # environment:
    #   name: <環境名>

    runs-on: ubuntu-latest

    defaults:
      run:
        shell: bash

    steps:
      - name: Checkout branch
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_DEFAULT_REGION }}
          role-to-assume: ${{ env.AWS_ROLE_ARN }}

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1
        with:
          terraform_version: ${{ env.TF_VERSION }}

      - name: Exec Terraform fmt check
        run: |
          terraform fmt -recursive -check

      - name: Exec Terraform init
        run: |
          cd <作業ディレクトリ>; pwd; terraform init

      - name: Exec Terraform plan
        run: |
          cd <作業ディレクトリ>; pwd; terraform plan -no-color

      - name: Exec Terraform apply 
        uses: dflook/terraform-apply@v1
        with:
          path: policys
          auto_approve: true
コメント
現在コメントはありません。
コメントする
コメント入力

名前 (※ 必須)

メールアドレス (※ 必須 画面には表示されません)

送信