Terraform for AWS 入門
目標
GitHub Actions のセルフホストランナーを Terraform を使って構築。
もちろん GitHub Actions でビルドする。
前提
インフラ初心者です。調べながら書いていきます。
間違っているところやもっといいやり方があったらコメントもらえると嬉しいです。
Terraform
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
セルフホストランナー
Terraform で構築されるサーバーです。
パブリックリポジトリでのセルフホストランナーのセキュリティ - GitHub Docs
パブリックリポジトリでは、セルフホストランナーを使わないことをおすすめします。
パブリックリポジトリのフォークでは、ワークフロー中のコードを実行するプルリクエストが作成されると、セルフホストランナー上で危険なコードが実行される可能性があります。
こちらの都合上、実際にセルフホストランナーで動いているリポジトリは公開できません。
環境構築
まずは環境構築から。
ローカル環境に terraform
コマンドや aws
コマンドをインストールするのは手間なので最初から GitHub Actions で動かします。
GitHub ホストランナー にはどちらのコマンドもインストールされています。
リポジトリの作成
リポジトリを作成します。
今回は SnowCait/terraform-sandbox を作成しました。
AWS で発行したアクセスキーをリポジトリの Settings > Secrets に登録しておきます。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
ワークフロー
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 ファイルで作ります。
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
WIP
EC2 インスタンスを実際に起動する
terraform apply
terraform.tfstate が更新されます。
ローカルだと手元にファイルが残りますが、 GitHub Actions は毎回真っ新になってしまうのでコミットしておきます。
.terraform.lock.hcl
- v0.14 から導入された
-
terraform init
で生成される - バージョン管理システムにコミットしておく必要がある
terraform 0.14.0 terraform.lock.hclはレビュー時に理解必須なので要約してみた - Qiita