Terrafrom✖︎GitHub Actions入門

GitHub Actionsを一度も触ったことがないのはやばいと思い触ってみることにしました。

今回はGitHub Actionsを使ってTerraformコードをmainブランチにpushされた段階でAWS環境にデプロイされる簡単なものを作っていきたいと思います。

## リポジトリの作成

今回本記事用に以下リポジトリを作成しました。

https://github.com/jh6230/github-actions-test

## GitHub ActionsからAWS環境への接続

GitHub ActionsからAWS環境への認証方式としてOIDCを使用します。

https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

GitHubリポジトリのSecretsに環境変数を設定してアクセスキーなどを参照する方法がありますが調べてみるとこちらの方式の方がベターのようです。


IAM＞IDプロバイダからプロバイダを追加していきます。

以下設定で作成します。

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

![Screenshot 2023-08-13 at 0.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626370/ef29b42a-a668-8bfe-e8b4-dc995b890182.png)


次に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}`にAWSのアカウントIDを設定します。

`repo:{GITHUB_ORG_NAME}/{GITHUB_REPO_NAME}`
を
`repo:jh6230/github-actions-test`

に設定します。

ロール権限は今回は　`Administrator`権限を付与しておきます。



## Terraformコードの作成

事前にtfstateファイルCLI等で作成しておきます。

```
terraform {
  required_version = ">= 1.5.0"
  backend "s3" {
    bucket = "github-actions-test-2023-0815" # 作成したS3バケット
    region = "ap-northeast-1"
    key = "terraform.tfstate"
    encrypt = true
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "my_vpc" {
  cidr_block = "192.0.0.0/22"

  tags = {
    Name = "github-actions-test"
  }

}

```

## workflowファイルの作成


```
name: AWS Deply

on:
  push:
    branches:
      - main

env:
  AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
  AWS_REGION: ap-northeast-1

permissions:
  id-token: write
  contents: read
  
jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        
      - name: Configure AWS Account
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-region: ${{ env.AWS_REGION }}
          role-to-assume: ${{ env.AWS_ROLE_ARN }}
          
      - name: Set Up Terraform
        uses: hashicorp/setup-terraform@v1
      
      - name: Terraform Init
        run: terraform init
        
      - name: Terraform Validate
        run: terraform validate
      
      - name: Terraform Fmt
        run: terraform fmt
      
      - name: Terraform Plan
        run: terraform plan
        
      - name: Terraform Apply
        run: terraform apply -auto-approve
```

### 簡単に説明

- name：ワークフロー名
- on:GitHub Actionsが実行されるタイミング
- env：ワークフローファイル内で使用する環境変数を設定
- permission：GitHub Actionsを実行するために必要な権限
(参考)https://zenn.dev/not75743/scraps/926f2693809744
- jobs：実行ジョブ

commitしてpushします。

GitHub Action経由でリソースの作成ができました。

![Screenshot 2023-08-13 at 0.44.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626370/a731cbd9-ead4-4664-8b6d-74b6064d969e.png)

これで少しはGitHub Actionsの知識はついたかな、、

あとは実践あるのみです！！