👻

[Terraform/AWS]direnvでAWS IAM IdentityCenterの認証情報を取得する方法

2024/09/16に公開

記事を書いた経緯

  • 業務中、ふと手が空いたタイミングでREADMEを確認した際に、direnvに関する記述を見つけたためです。
    それと同時にREADMEは隅々まで読んでおくべきだなと改めて感じた瞬間でした。
     

本記事を読み終わった時のゴール

  • direnvを使用してAWSの認証情報(access_key,secret_access_key,session_token)を取得し、
    各modulleでterraformプロジェクトを実行できる事。
     

前提の環境

  • インストール方法やシェルの種類が全体的にMacOS向けの説明になっています。
  • AWS IAM Identity Center及びOrganizationsで管理しているアカウントの認証情報の取得に関する内容になっています。
     

本編

direnvとは?

  • ディレクトリごとに環境変数を設定して適用出来るコマンドラインツールです。
    異なるプロジェクトや作業環境で特定の環境変数を使用する必要がある場合、
    direnvを設定することで、そのディレクトリに移動したときに自動的に環境変数を切り替えることができます。

メリット

  • ディレクトリごとに固有の環境変数を動的に使用できるため、手動での認証情報の埋め込み等の手間が省ける。
  • 多数のAWSアカウントをIdentity Center(旧SSO)/Organizationsで管理している場合に意図しないアカウントの認証情報を誤って使用する事を防げる。
    (Terraform,CLI,SDK等のAWS APIリクエストで制御する際は非常に助かります。)

インストール

~
brew install direnv

設定

1. シェルにhookを設定する
~/.zshrc
export EDITOR=vi #使用するエディタを環境変数で設定。
eval "$(direnv hook zsh)" # direnvのフックをシェルに設定して、direnvの自動読み込みを有効化。
~
source /.zshrc
~/.zshrc
export EDITOR=vi
eval "$(direnv hook zsh)"
~
source /.zshrc

 

2. クライアントからAWSにアクセスするための設定
~
vi .aws/config
~/.aws/config
[profile xx_AdministratorAccess]
region = {デフォルトリージョン}
output = json
sso_start_url = https://{IAM Identity Centerの設定値}awsapps.com/start
sso_region ={IAM Identity Centerの設定リージョン }
sso_account_id = {AWSアカウントID}
sso_role_name = {PermissionSetのname}

 

3. direnvで環境変数を使用したいディレクトリの設定
~/github/terraform/project_a
vi .envrc
~/github/terraform/project_a/.envrc
export AWS_PROFILE="xx_AdministratorAccess"
  • 実行する事でユーザー側からシェルに対して明示的にこの.envrcを信頼することを指示。
~/github/terraform
direnv allow 
  • 環境変数として設定されているSSOのユーザー情報を使用してログインを行う。
~/github/terraform/project_a
aws sso login --profile $AWS_PROFILE 

~/github/terraform/allow_envrc.sh
#!/bin/zsh
PROJECTS=($(find . -type f -name ".envrc"))
MAIN_DIR=$(pwd)

for project in "${PROJECTS[@]}" ; do
  # .envrcファイルのあるディレクトリに移動
  PROJECT_DIR=$(dirname "$project")

  # ディレクトリに移動してdirenv allowを実行し、元のディレクトリに戻る
  pushd "${MAIN_DIR}/${PROJECT_DIR}" > /dev/null
  direnv allow
  popd > /dev/null
done
echo "run allowed .envrc !!"


 

4.TerraformでAWSの認証情報を環境変数として取得できているか確認。
  • direnvが機能していれば、手動で環境変数に埋め込まなくても書きコマンドが実行できる。
~/github/terraform/project_a
terraform init

5.Terraformコードでのprofileの設定

  • terraformブロックのステートとProviderブロックにprofileを設定する必要があります。値は環境変数で設定しているprofile名です。
  • 試行錯誤の末の対応のため、より適切な方法があるかもしれません。
_config.tf

terraform {
  required_version = "1.9.8"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "5.74.0"
    }
  }

  backend "s3" {
    bucket  = "hoge"
    key     = "hoge"
    region  = "ap-northeast-1"
    profile = "{.envrcで設定した環境変数の値}" // ここ
  }
}

provider "aws" {
  region  = "ap-northeast-1"
  profile = "{.envrcで設定した環境変数の値}" // ここ

  default_tags {
    tags = {
      Repository = local.repo
      Directory  = local.dir
    }
  }
}
GitHubで編集を提案

Discussion