GitHub Actionsを利用したAWSリソースの構築(CI/CD初心者向け)

GitHub Actionsを利用したAWSリソースの構築(CI/CD初心者向け)
サムネ出典URL:https://github.com/logos

目次

    はじめに

    クラウドインテグレーション部の渡邊です。

    本記事はGitHub Actionsを利用する際の設定方法から、実際にGitHub Actionsを利用したTerraformによるAWSリソースの構築までをハンズオン形式で紹介していきます。

     

    GitHub Actionsの概要は以下の記事で紹介しておりますので是非参考にしてください。

    GitHub Actionsを使ったCI/CD

    なお、こちらの記事はGitHubの基本的な操作(commit , push など)を理解している前提で記述しています。

    目次

    1. AWS環境とGitHub環境のセットアップ
    2. GitHub Actionsの定義ファイルの作成
    3. GitHub Actionsの実行&動作確認(TerraformによるAWSリソースの作成)

    1.AWS環境とGitHub環境のセットアップ

    事前に以下の準備をお願いします。すでにアカウントがある場合はそちらを利用して構いません。

    • AWSアカウント作成
    • GitHubアカウント作成
    • 任意の名前のリポジトリの作成

     

    1.1 AWS側の設定

    AWS側の設定としてプロバイダの設定とIAMロールの設定を行います。

    プロバイダの設定は、IAMロールの信頼するプロバイダーとしてGitHub Actionsを指定するために必要です。

    IAMロールの設定は、GitHub Actionsのワークフローに含まれるTerraformを利用したAWSリソースの作成のために必要です。

    1.1.1 プロバイダの設定

    IAMのコンソール画面左の「IDプロバイダ」から「プロバイダを追加」をクリックしてください。

     

    【IAMのIDプロバイダ設定画面】の各設定項目に以下の値の入力と「サムプリントの取得」をクリックしてから「プロバイダを追加」をクリックしてください。

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


    【IAMのIDプロバイダ設定画面】
    202211github01

     プロバイダの追加に成功すると、以下の【プロバイダ追加成功メッセージ】が表示されます。

     

    【プロバイダ追加成功メッセージ】202211github02

    また、以下の【サムプリント取得エラーメッセージ】のようにサムプリント取得時にエラーが発生した場合は、すでに作成されているのでこちらのステップは飛ばして構いません。

     

    【サムプリント取得エラーメッセージ】

    202211github03

     

    1.1.2 IAMロールの設定

    IAMのコンソール画面左の「ロール」から「ロールを作成」をクリックしてください。

    各設定項目を以下の通りに設定してください。

    • 信頼されたエンティティタイプ:ウェブアイデンティティ
    • ウェブアイデンティティ:token.actions.githubusercontent.com
    • Audience:sts.amazonaws.com

    IAMロールに付与するポリシーは、今回Terraformを利用したVPCの作成を想定しているため「AmazonVPCFullAccess」を設定してください。

    最後に任意のIAMロールの名前を指定し、ロールを作成してください。

     

    1.2 GitHub側の設定

    ここでは、GitHub Actionsで利用するIAMロールのARNを直接コードに記載しないために、secretsに登録します。

    リポジトリ内のSettings > Secrets > Actionsへ移動し、先程作成したロールのARNを以下画像赤枠に記載の`New repository secret`をクリックして登録します。

     

    【Actions secrets設定画面(Repository secrets登録前)】202211github04

    登録する際には以下の値を設定します。

    • Name: AWS_ROLE_ARN
    • Secret: 「1.2 IAMロールの設定」で作成したIAMロールのARN

    登録すると以下画像の通り、`Repository secrets`に登録されます。

     

    【Actions secrets設定画面(Repository secrets登録後)】202211github05

    2.GitHub Actionsの定義ファイルの作成

    2.1 定義ファイルの作成

    GitHub Actionsを利用するために必要なワークフローの定義ファイルを作成します。

    ワークフローの定義ファイルはリポジトリの.github/workflows配下にYAML形式で配置する必要があります。

    よって、今回は「githubactions.yml」というワークフロー の定義ファイルを作成し「リポジトリ名/.github/workflows/githubactions.yml」の形で配置してください。

    ※mainブランチをトリガーにワークフローを実行するように設定しているため、mainブランチで作成してください。

     

    中身は以下の定義ファイルを利用しています。

     

    githubactions.yml

    name: 'GitHubActions-Terraform'
    on:
      push:
        branches:
          - "main"
     
    jobs:
      apply_tf:
        name: Terraform apply
        runs-on: ubuntu-latest
        permissions:
          id-token: write
          contents: read
     
        steps:
        - name: set ROLE
          run: |
            echo "AWS_ROLE_ARN=$" >> $GITHUB_ENV
     
        - name: Checkout
          uses: actions/checkout@v3
     
        - name: configure AWS credentials
          uses: aws-actions/configure-aws-credentials@v1
          with:
            role-to-assume: $
            aws-region: ap-northeast-1
     
        - name: Setup Terraform
          uses: hashicorp/setup-terraform@v2
          with:
            terraform_version: ~1.2.0
     
        - name: Terraform Init
          run: terraform init
          working-directory: terraform
     
        - name: Terraform Apply
          run: terraform apply -auto-approve
          working-directory: terraform
    

     

    定義ファイルの中身について

    GitHub Actionsには、ワークフロー、ジョブ、ステップの3つの実行単位があります。

    • ワークフロー:複数のジョブで構成される処理全体
    • ジョブ:複数のステップで構成された処理
    • ステップ:コマンドやアクションの実行処理

    それぞれの関係は【定義ファイル構成概要】の通りです。

     

    【定義ファイル構成概要】

    202211github06

     

    以下定義ファイルの詳細を適宜区切って説明します。

     

    #ワークフロー名
    name: 'GitHubActions-Terraform'
     
    #イベントトリガー
    on:
      push:
        branches:
          - "main"
    
    • on
      • ワークフローを実行するトリガーとなるイベント
      • ここでは`main`ブランチにpushされたときにワークフローが実行されるということを意味します

    jobs:
      #ジョブid
      apply_tf:
        #ジョブ名
        name: Terraform apply
        #ジョブ実行するマシンのタイプ
        runs-on: ubuntu-latest
        #ジョブの権限設定
        permissions:
          id-token: write
          contents: read
    
    • jobs
      • ワークフロー内のジョブグループ
      • ジョブグループの配下にジョブidを定義します
      • 今回はジョブidとして`apply_tf`を定義しています。ジョブid配下で`Terraform apply`というジョブ名、マシンタイプ、GITHUB_TOKENの権限を定義します 
    • runs-on
      • ジョブ実行するマシンのタイプ
      • マシンとして任意のランナーを選択するのですが今回はUbuntuを指定しています。(※1)
    • permission
      • GITHUB_TOKENの権限
        • GITHUB_TOKENはワークフロー実行時に利用するアクセストークンです
      • ジョブ全体、あるいは個々のジョブに対して設定することができます
      • ジョブに与えられるGITHUB_TOKENのデフォルト権限を変更したい場合に設定します(※2)

    (※1)GitHub でホストされるランナーの選択

    (※2)GITHUB_TOKENのパーミッション

     

        steps:
        - name: set ROLE
          #コマンド実行
          run: |
            echo "AWS_ROLE_ARN=$" >> $GITHUB_ENV
     
        - name: Checkout
          #利用するアクション
          uses: actions/checkout@v3
     
        - name: configure AWS credentials
          uses: aws-actions/configure-aws-credentials@v1
          
          with:
            role-to-assume: $
            aws-region: ap-northeast-1
     
        - name: Setup Terraform
          uses: hashicorp/setup-terraform@v2
          with:
            terraform_version: ~1.2.0
     
        - name: Terraform Init
          run: terraform init
          working-directory: terraform
     
        - name: Terraform Apply
          run: terraform apply -auto-approve
          working-directory: terraform
    

    ジョブid配下には、stepsというタスクのグループが含まれています。

    • steps
      • タスクのグループ
        • タスクはstepという単位で実行されます
      • 今回はTerraformコマンドの実行やパブリックリポジトリのアクションを利用するためにstepを定義しています
    • uses
      • 利用するアクション
        • アクションは再利用可能なコードの単位で、パブリックリポジトリやコンテナで定義されたアクションを利用するよう指定できます
      • 今回はパブリックリポジトリのTerraformやGitHub Actions用のアクションを利用するために定義しています
    • with
      • アクションによって定義されたキーとマッピングする値のセット
      • 入力されたパラメータは環境変数としてセットされます
      • 今回はIAMロールのARN、リージョン、Terraformのバージョンを定義しています
    • run
      • シェルで実行するコマンド等のプログラム
      • 今回はTerraform関連のコマンドを記述しています
    • working-directory
      • リポジトリ内の作業ディレクトリ
      • リポジトリのルートディレクトリからパスを指定します
      • 今回は作業ディレクトリとして`terraform`を指定しているので、このディレクトリでrunに記載されたコマンドが実行されます

     

    以上が今回使用する定義ファイルの中身の説明です。

    構文について詳しく知りたい方は以下の「GitHub アクションのワークフロー構文」を参考にしてください。

    参考:GitHub アクションのワークフロー構文

    3.GitHub Actionsの実行&動作確認

    3.1 Terraformのファイルをリポジトリに反映して動作確認

    では早速、Terraformの定義ファイルとして「リポジトリ名/terraform/main.tf」をmainブランチに配置して動作確認をします。

    以下のファイルはTerraformでVPCを作成するためのファイルです。

    ※リポジトリにファイルを配置すると、GitHub Actionsの実行によりAWS環境にVPCが作成されます。

     

    main.tf

    resource "aws_vpc" "main" {
      cidr_block = "10.0.0.0/16"
      tags = {
        Name = "githubactions-vpc"
      }
    }
    

    このように作成できたらリポジトリのActionsタブを確認してみましょう。

    Actionsタブではワークフローの実行履歴を確認できます。

    以下の画像のようにチェックマークがついてたら成功です。

     

    【ワークフロー実行の履歴】

    202211github07

    AWSコンソールからVPCを確認すると【AWS VPCコンソール画面】のように、VPCが作成されています。

     

    【AWS VPCコンソール画面】

    202211github08

    後片付け

    今回作成したリソースはVPCのみであるため、AWSコンソール画面から作成したVPCを削除してください。

    ※GitHubのリポジトリ上からTerraformのファイルを削除しても、ステートファイルでリソース管理をしていないためAWS環境のリソースは削除されません。

    まとめ

    お疲れ様でした。

    このようにファイルをリポジトリに反映させただけで自動的に実行されると、開発の負担が楽になることを実感していただけたら幸いです。

    最後までお読みいただきありがとうございました。

    アジアクエスト株式会社では一緒に働いていただける方を募集しています。
    興味のある方は以下のURLを御覧ください。