GitHub ActionsでTerraformを使用し、AWS環境に対して自動でterraform fmt -check
terraform init
terraform plan
terraform apply
を実行する方法についてメモ書きします。
GitHub Actionsを利用する方法
作成中のプロジェクトの.github/workflows
配下にymlファイルを作成し、その中にGitHub Actionsの実行条件や内容を記載することで利用できます。
ymlファイル配置先
<プロジェクト名>/.github/workflows/<任意の名前>.yml
GitHub ActionsからAWSにアクセスする
あるAWSユーザーでGitHub ActionsからAWSにアクセスするには、workflowsのymlファイルに次のような設定を行います。
※secrets.変数
は GitHub GUI上のリポジトリ -> Settings -> Environments
で設定できる
- name: Configure aws credentials
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
ただ、使用するユーザーがMFAによる認証を必要としていたり、セキュリティ上、上記の設定が利用できない場合、OIDC
を利用した接続設定を行う必要があります。
今回はOIDC
を利用して設定を進めていきます。
OIDCの設定
この章では、GitHub Actions OIDCでAssumeRoleする設定を行います。参考
まずIDプロバイダ
を作成を作成します。
それぞれ次のように設定します。
プロバイダのタイプ: OpenIDConnect
プロバイダのURL: https://token.actions.githubusercontent.com
対象者: sts.amazonaws.com
次に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}
部分には先ほど作成したIDプロバイダ
のアカウントIDを設定します。
アカウントIDは IAM -> ID プロバイダ -> <先ほど作成したIDプロバイダ> -> ARN 欄
にある12桁の数字です。
{GITHUB_ORG_NAME}/{GITHUB_REPO_NAME}
はGithubにGUIで作業対象のレポジトリにアクセスすると、URLに設定値が表示されるのでそちらを設定します。
https://github.com/<GITHUB_ORG_NAME}>/<GITHUB_REPO_NAME>
設定ができたら次へ
ボタンを押します。
次の画面で許可ポリシー
の設定を行います。
使用したいポリシーが決まっていればそちらを設定します。
まだ決まっていなければひとまず、AdministratorAccess
を設定しておきます。
設定ができたら次へ
ボタンを押します。
次の画面でロール名
を設定してロールの作成
ボタンを押下します。
これでOIDCの設定は完了です。
作成が完了したらIAM -> ロール -> <今回作成したロール名>
をクリックし、ARN
の値をメモします。
GitHub ActionsでAWSへ接続できるか確認
コード上の<プロジェクト名>/.github/workflows/<任意の名前>.yml
に移動し、次のような設定を行います。
<作業ブランチ名>には現在作業しているブランチ名、
<作成したOIDC IAMロールのARN>には先ほどメモしたARN
の値を設定します。
name: AWS Deploy
on:
push:
branches:
- <作業ブランチ名>
env:
AWS_ROLE_ARN: <作成したOIDC IAMロールのARN>
permissions:
id-token: write
contents: read
jobs:
aws-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: ${{ env.AWS_ROLE_ARN }}
aws-region: ap-northeast-1
- run: aws sts get-caller-identity
こちらをcommit -> push
した後、GitHubのサイト-> 作業レポジトリ -> Actions
を確認してエラーとなっていなければOIDCの設定は上手くいっています。
GitHub ActionsでTerraformを実行する
ymlファイルを次のように設定して、ブランチをcommit -> pushすると自動でterraform fmt -check
``terraform init``terraform plan``terraform apply
が実行されます。
< >
の箇所はご自身の環境に合うように修正してください。
name: <任意のAction名>
on:
push:
branches:
- prototype
env:
TF_VERSION: 1.1.2
AWS_ROLE_ARN: <作成したOIDC IAMロールのARN>
AWS_DEFAULT_REGION: ap-northeast-1
permissions:
id-token: write
contents: read
jobs:
deploy:
# environmentはgithub上でsetting -> environmentの設定をしていない場合は不要
# environment:
# name: <環境名>
runs-on: ubuntu-latest
defaults:
run:
shell: bash
steps:
- name: Checkout branch
uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ env.AWS_DEFAULT_REGION }}
role-to-assume: ${{ env.AWS_ROLE_ARN }}
- name: Setup Terraform
uses: hashicorp/setup-terraform@v1
with:
terraform_version: ${{ env.TF_VERSION }}
- name: Exec Terraform fmt check
run: |
terraform fmt -recursive -check
- name: Exec Terraform init
run: |
cd <作業ディレクトリ>; pwd; terraform init
- name: Exec Terraform plan
run: |
cd <作業ディレクトリ>; pwd; terraform plan -no-color
- name: Exec Terraform apply
uses: dflook/terraform-apply@v1
with:
path: policys
auto_approve: true