TerraformManagingUser라는 IAM User를 생성한다. 해당 유저는 다른 AWS 계정에 있는 TerraformAssumeRole을 Assume 할 수 있는 권한이 있다. Terraform 설정파일에 (보통 provider.tf) Assume Role을 지정할 수 있는 속성이 있는데 해당 속성을 지정하게 되면 Role 기반으로 Terraform 명령어가 수행된다.
# 사용자에게 필요한 정책
# TerraformManagingPolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam::<account_id>:role/<account_role>"
]
}
]
}
IAM User : TerraformManagingUser
Policy : TerraformManagingPolicy
# 신뢰 관계 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<account_id>:user/<account_user>"
},
"Action": "sts:AssumeRole"
}
]
}
IAM Role : TerraformAssumedRole
Policy : AdministratorAccess
provider "aws" {
region = "${local.region}"
assume_role {
role_arn = "arn:aws:iam::<account_id>:role/TerraformAssumedRole"
}
}
provider.tf 파일을 위와 같이 수정한다.
아래 2가지 중 1개를 선택하여 인증할 방식을 선택한다.
# Environment Variables
% export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
% export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
키를 통한 설정
# ~/.aws/profile
[account_id]
aws_access_key_id = <AWS_ACCESS_KEY_ID>
aws_secret_access_key = <AWS_SECRET_ACCESS_KEY>
}
AWS Profile을 지정
# profile 환경 변수에 정의
% export AWS_PROFILE=account_id
# profile 환경 변수에 삭제
% unset AWS_PROFILE
# profile, credential 확인
% cat ~/.aws/profile
[dolfin-global]
aws_access_key_id = AK123...
aws_secret_access_key = 1234....
[dolfin-global-TerraformUser]
aws_access_key_id = AK456...
aws_secret_access_key = 4567...
% cat ~/.aws/credentials
[dolfin-global]
aws_access_key_id = AK123...
aws_secret_access_key = 1234....
[dolfin-global-TerraformUser]
aws_access_key_id = AK456...
aws_secret_access_key = 4567...
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 0.12"
backend "s3" {
region = "ap-northeast-2"
bucket = "wb-terraform-bucket"
key = "terraform/terraform.tfstate"
profile = "dolfin-global" # 해당 프로파일은 .aws/profile 과 config, credential 에 모두 있어야 한다. 위 예시처럼
# dynamodb_table = "wb-terraoform-dynamo"
# encrypt = true
}
}
#######################
# Profile 기반 provider
#######################
provider "aws" {
region = "ap-northeast-2"
profile = "dolfin-global"
}
#######################
# Role 기반 provider
#######################
provider "aws" {
region = "ap-northeast-2"
assume_role {
role_arn = "arn:aws:iam::<account_id>:role/TerraformAdmin"
}
}