【Terraform】GitHub Actions を使って、planやapplyを自動化しよう

Terraform

 

Terraformでの plan, apply をGitHub Actions で自動化してみます

 

ゴール

 

↓の表のようなPR作成→マージの処理を作っていきます

No. 処理 備考
1 ブランチを作成し、PRを作成する
2 PR作成時に terraform plan が実行される 結果をPRにコメントで残す
3 planの結果をレビューする
4 PRをマージする
5 マージ時に terraform apply が実行される

 

前提

 

  • AWSやTerraformに関して、基本的な知識がある
    細かい説明は省くので、ご注意ください
  • AWS CLIから操作できる環境がそろっている

 

つくってみる

 

以下の流れで自動化していきます

  1. tfstateファイルをS3で管理
  2. OIDC(OpenID Connect)を作成
  3. GitHub Actions でAWSにアクセスできるかテスト
  4. GitHub Actions に plan と apply を組み込む

 

今回は「terraform_test」という名前のGitリポジトリを使用します

 

tfstateファイルをS3で管理

 

下記のように2つのファイルを作成します

terraform_test
├── .gitignore     // 作成
├── README.md
└── main.tf      // 作成

 

tfstateを保存するS3バケットを作成

 

各ファイルの中身

 

 

main.tf 内のコメントにも書きましたが、バケット名は一意である必要があります
なので、バケット名は変更してください!!

 

次のコマンドを実行していき、S3を作成します

 

AWSコンソールで確認してみます。

無事作成できました

 

tfstateの保存先をS3へ変更

 

main.tfのterraformブロック内にbackendを追記します

 

backendの設定をしたので、terraform init を実行します

 

tfstateファイルがS3にコピーされているか確認します

コピーされていますねー

 

OIDC(OpenID Connect)を作成

 

GitHub の Actions secrets and variables からAWSの認証情報を読み込む方法もありですが、
セキュリティ面を考慮してOIDCを使います。

 

こちらを参考にiam.tfを作成します

(ディレクトリ)

terraform_test
├── .gitignore
├── README.md
├── iam.tf    // 作成
└── main.tf

(iam.tfの中身)

 

上記をterraform applyしてIDプロバイダを作成します

 

AWSコンソールでも作成が確認できました

 

いったんここまでの内容をmainブランチにcommit、pushしておきます

 

GitHub Actions でAWSにアクセスできるかテスト

 

mainブランチからテスト用のtestブランチをきります

 

GitHub Actionsのワークフローを定義するため
.github/workflows/aws_access_test.yml を作成します

 

.github/workflows/ 配下のYAMLファイル
ワークフローを定義することでGitHub Actionsを使用できます

 

(ディレクトリ)

terraform_test
├── .github
│ └── workflows
│  └── aws_access_test.yml  // 作成
├── .gitignore
├── README.md
├── iam.tf
└── main.tf

 

こちらを参考にaws_access_test.ymlに記述していきます

 

testブランチにpushした際に

aws sts get-caller-identity

が実行されるワークフローが定義できました!

 

このワークフローでGitHub ActionsからAWSにアクセスできるかpushして確認します

 

GitHub > リポジトリ > Actions から結果を確認できます

 

成功していれば、.github/workflows/aws_access_test.yml は
もういらないので削除しておきます

 

GitHub Actions に plan と apply を組み込む

 

plan用とapply用のワークフローを作成します

ポイントは

  • PR作成時にplanを実行し、結果をコメントに残す
  • PRマージ時にapplyを実行する

 

.github/workflows/にplan.yml と apply.yml の2つのファイルを作成します

(ディレクトリ)

terraform_test
├── .github
│ └── workflows
│  └── plan.yml   // 作成
│  └── apply.yml  // 作成
├── .gitignore
├── README.md
├── iam.tf
└── main.tf

 

こちらを参考にymlファイルに記述していきます

 

 

ためしてみる

 

GitHub Actions のワークフローが作成できたので、テストしてみます

 

main.tfに下記を追記して、EC2を定義します

 

commit → push します

 

GitHubのサイトでPRを作成して少し待ってみると。。。

↓のようにPRにplanの結果がコメントされます

 

Q:PR作成後に追加でコミットしたらplanは再実行されるのでしょうか?
A:plan.ymlで定義した内容が再実行されます。

 

マージして、GitHub > リポジトリ > Actions で成功を確認したら、
AWSコンソールでも確認してみます

 

 

これで自動化できましたー

 

テストで作成したEC2は不要なので、削除しておきましょう

main.tfの下記の部分を削除してpush→PR作成・マージします

 

AWSコンソールから削除されていることを確認したらOKです!

 

やり残したこと

 

tfファイルに差分があるときのみplanやapplyを実行するようにしたいなーと思いました

いつか取り組んでみますー

 

参考

 

AWS | Terraform | HashiCorp Developer
Build, change, and destroy AWS infrastructure using Terraform. Step-by-step, command-line tutorials will walk you through the Terraform basics for the first tim...
GitHub ActionsでTerraformの実行を自動化する
【GitHub Actions】TerraformでデプロイするCI/CDパイプラインの構築手順
GitHub でソースコードを管理しているとして、複数人で Terraform を利用する場合、それぞれが terraform plan、terraform apply コマンドを実行することになります。   今回は GitHub
RURUK BLOG
主にIT関連の記事を掲載しています。記事のほかには、各人気Webサイトから最新情報を取得するスクレイピングツール【RURUK Trend Checker】や検索順位チェックツール【検索順位チェッカー RURUK】なども公開しています。著者:ITエンジニア
TerraformでtfstateファイルをS3で管理する - Qiita
TL;DRTerraformでのtfstateファイルを管理するためにbackendとしてS3を使用する。前提条件AWSアカウントCLIから操作できる権限を持つユーザ & AWS-Cliに対…

 

コメント

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