terraformでディレクトリごとにAWSアカウントを切り替える
現在複数のAWSアカウントを利用する機会があり、terraformでディレクトリごとにAWSアカウントを設定するためdirenvを使用していたんですが、terraform標準の機能に切り替えた記録です。
前提
- IAM自体は事前に作成済みの状態で進めさせていただきます
- MacOSでの解説になります
セキュリティリスクを未然になるべく減らしたい
今回管理方法を変えた個人的な理由として未然にセキュリティリスクを減らしたいというものがありました。direnvは学習の際参考書籍で使用されていたのでそのまま参考にしてローカルで使用しておりました。しかしAWSのアクセスキーとシークレットキーという漏れたらAWSアカウントを乗っ取られ不正利用される恐れのある情報をプロジェクトディレクトリに置くという形になっていました。もちろん.gitignoreでgit管理から外したり、リモートリポジトリをプライベートにしたり、ネット上に上げないという形であれば大丈夫だと思いますが、事前に事故になりそうな部分をなるべく減らしておくという考えで今回別の方法を探していました。
以下早速手順を進めてみます。
credentialsに設定を加える
~/.aws/credentialsに以下のように設定を加えます。
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[study-project]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
おそらくAWS-CLIなどのなんらかのAWSのCLIツールを使用したことがある方であれば上記のようにdefaultの設定が入っていると思いますがそこに新たにstudy-projectというものを加えて設定しています。ちなみにこのaws_access_key_idというのは『AWSコンソール』→『セキュリティ認証情報』→左メニューの『ユーザー』画面で『認証情報タブ』を見ることで確認できます。
terrafrom側での設定
terraform管理のディレクトリ直下に以下のファイルを作成します。
terraform {
backend "s3" {
bucket = "<bucket_name>"
key = "terraform.tfstate"
region = "ap-northeast-1"
dynamodb_table = "<dynamo_db_table_name>"
shared_credentials_file = "[$HOME/.aws/credentials]"
profile = "study-project"
}
required_providers {
aws = ">= 2.43.0"
}
}
provider "aws" {
shared_credentials_file = "[$HOME/.aws/credentials]"
profile = "${terraform.workspace}-project"
region = "ap-northeast-1"
}
terraformブロックではterraform state(構成ファイルを保存する)時に必要となるS3ようの権限を設定しています。
そしてproviderブロックではAWSのアカウント情報とリージョンを設定しています。terraform.workspaceという変数は後述するコマンドで渡す引数を受け取ります。
terraformのworkspace
terraformにはworkspaceというものがありこれでクラウドのアカウントやリージョンを指定できます。
$ terraform workspace show
default
初期設定ではdefaultが設定されていますね。
以下のコマンドで
ここで以下のコマンドを実行することでterraform.workspaceに環境を紐づけることができます。
$ terraform workspace new study
$ terraform workspace select study
$ terraform workspace list
default
* study
アスタリスクがついているworkspaceが現在選択されているものです。
あとは通常通り以下のコマンドでAWSに反映できます。
$ terraform plan
$ terraform apply
参考
大変わかりやすく解説していただいていました。感謝です。
Discussion