【Terraform】バックエンドにprofileを指定してS3を利用する【AWS】

10月 11, 2023

どもども、今回はライトめの記事です。


terraformを利用する際、最初にバックエンドとプロバイダーを指定してinitする必要があるかと思いますが、さらにprofileを指定してinitする際、少してこずってしまったので備忘録として残しておきます。


まず大前提として名前付きprofileの設定が正しく行われているものとします。この辺りがピンときていない方はこちらの公式ドキュメントを参照してください。


今回はstateを保存するバケット名が"terraform-<account_id>"、"terraform"という名前のprofileをあらかじめ用意している場合を想定します。最終的にたどり着いた設定内容は以下の通りでした。

terraform {
  backend "s3" {
    bucket                  = "terraform-${local.account_id}"
    key                     = "default.tfstate"
    region                  = "ap-northeast-1"
    shared_credentials_file = "~/.aws/credentials"
    profile                 = "terraform"
  }
}

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

アカウントIDはlocal変数で取得します。

data "aws_caller_identity" "current" {}

locals {
    account_id = data.aws_caller_identity.current.account_id
}

本来はここで"terraform init"をすると正しく初期化が行われますが、下記のようなエラーが出てしまう場合もあります。

Error refreshing state: AccessDenied: Access Denied
        status code: 403, request id: ...

いくつか原因が考えられますが、まずはprofileやバックエンドの設定が正しいか再確認してください。

正しかった場合は、.terraformディレクトリを削除してもう一度initしてみてください。


まだ設定が正しくない状態で作成された.terraformディレクトリが残っていたためにエラーが発生するようです。僕はここで少してこずってしまいました。


無事にinitできることでしょう!

さいごに

今回はバックエンドにs3バケットとprofileを指定してinitする方法を記事にしました。


とはいえこの方法は関わる全てのメンバーが設定しているprofile名が統一されていることが前提ですので、その辺りがまだ整備されていない場合はあまりお勧めできません…。

$ export AWS_PROFILE=<profile名>

状況に合わせて上記コマンドなどで各々の設定に合わせた運用を試みるなど、方針をしっかり定めておくことが大切です。


以上、最後まで読んでいただきありがとうございました!

AWS,Terraform

Posted by CY