Terraform Assume Role 기반으로 인증 방식 변경

신동수·2024년 2월 27일
0

Terraform

목록 보기
3/10

개요

  • Terraform이 프로비저닝 해야 할 AWS의 Account가 늘어나면 늘어날수록 각 계정에 대한 Key 관리가 부담스러워진다. 그 관리 부담을 덜 수 있게 해주는 Assume Role 인증방식을 소개한다.

Assume Role 방식의 인증


TerraformManagingUser라는 IAM User를 생성한다. 해당 유저는 다른 AWS 계정에 있는 TerraformAssumeRole을 Assume 할 수 있는 권한이 있다. Terraform 설정파일에 (보통 provider.tf) Assume Role을 지정할 수 있는 속성이 있는데 해당 속성을 지정하게 되면 Role 기반으로 Terraform 명령어가 수행된다.

AWS 설정

# 사용자에게 필요한 정책
# 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

Terraform 설정파일 변경

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"
  }
}

참고
https://lalalilala.tistory.com/entry/Terraform-AWS-Role-%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%A6%9D%EB%B0%A9%EC%8B%9D-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0

profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글

관련 채용 정보