Open7

Terraform for AWS 入門

雪猫雪猫

目標

GitHub Actions のセルフホストランナーを Terraform を使って構築。
もちろん GitHub Actions でビルドする。

前提

インフラ初心者です。調べながら書いていきます。
間違っているところやもっといいやり方があったらコメントもらえると嬉しいです。

雪猫雪猫

Terraform

Terraform by HashiCorp

GitHub Actions

GitHub Actionsのドキュメント - GitHub Docs

GitHub ホストランナー

GitHub ホストランナーの仕様 - GitHub Docs

Terraform のビルドはこちらで行います。
GitHub ホストランナーにインストールされているバージョン。(2020年12月20日現在)

$ terraform version
Terraform v0.14.2

Your version of Terraform is out of date! The latest version
is 0.14.3. You can update by downloading from https://www.terraform.io/downloads.html

セルフホストランナー

自分のランナーをホストする - GitHub Docs

Terraform で構築されるサーバーです。

パブリックリポジトリでのセルフホストランナーのセキュリティ - GitHub Docs

パブリックリポジトリでは、セルフホストランナーを使わないことをおすすめします。
パブリックリポジトリのフォークでは、ワークフロー中のコードを実行するプルリクエストが作成されると、セルフホストランナー上で危険なコードが実行される可能性があります。

こちらの都合上、実際にセルフホストランナーで動いているリポジトリは公開できません。

雪猫雪猫

環境構築

まずは環境構築から。
ローカル環境に terraform コマンドや aws コマンドをインストールするのは手間なので最初から GitHub Actions で動かします。
GitHub ホストランナー にはどちらのコマンドもインストールされています。

リポジトリの作成

リポジトリを作成します。
今回は SnowCait/terraform-sandbox を作成しました。

AWS で発行したアクセスキーをリポジトリの Settings > Secrets に登録しておきます。

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

ワークフロー

.github/workflows/terraform.yml
name: Terraform

# Trigger
on:
  push:
    paths:
      - '**.tf'
      - '.github/workflows/terraform.yml'

# Job
jobs:
  configure:
    runs-on: ubuntu-20.04

    steps:
      - name: aws configure
        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

      # 動作確認
      - run: aws ec2 describe-instances
      - run: terraform version

Trigger

Terraform のファイルが更新されたときとワークフローが更新されたときに実行します。
* だと / を含まないので ** とします。
ファイルパスにマッチするパターン - GitHub Docs

Job

runs-on に実行するマシンの種類を指定します。
ubuntu-latest でも良いのですが GitHub の都合で OS バージョンが変化してしまうのでバージョンまで指定します。

aws configure 相当の処理として aws-actions/configure-aws-credentials を使用します。
Secrets に登録したキーは ${{ secrets.AWS_ACCESS_KEY_ID }} で参照できます。

これで Terraform を実行する環境が準備できました。

雪猫雪猫

WIP

EC2 インスタンスを起動したい

セルフホストランナー用のインスタンスを EC2 に作成します。

Terraform

EC2 インスタンスを起動する Terraform スクリプトです。
複数ファイルに分割できるようですがまずは main.tf 1 ファイルで作ります。

main.tf
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

# デフォルト設定を適用
provider "aws" {}

resource "aws_instance" "github-actions" {
  ami = "ami-02b658ac34935766f"
  instance_type = "t2.micro"
}

GitHub Actions

.github/workflows/terraform.yml
雪猫雪猫

WIP

EC2 インスタンスを実際に起動する

terraform apply

terraform.tfstate が更新されます。
ローカルだと手元にファイルが残りますが、 GitHub Actions は毎回真っ新になってしまうのでコミットしておきます。