👻
[Terraform/AWS]direnvでAWS IAM IdentityCenterの認証情報を取得する方法
記事を書いた経緯
- 業務中、ふと手が空いたタイミングで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
profile
の設定
5.Terraformコードでの- 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
}
}
}
Discussion