KMS 실습

Custom Key 관리하기

Custom Key 생성하기

  • Security 측면에서 서비스별/환경별로 서로 다른 Key를 지정해서 사용하는 것이 좋습니다.

  • IAM을 통해서 KMS Key에 대한 접근권한을 제한할 수 있기 때문에 더욱 세밀하게 권한관리를 할 수 있습니다.

  • Security 계정이 있으신 경우에는 Security 계정에 KMS Custom Key를 만드시고 Cross Account로 권한을 부여하시는 것이 가장 좋습니다.

  • KMS Custom Key의 경우에는 다른 리소스를 사용할 때 참조되는 경우가 많기 때문에 Output으로 정리하는 것이 중요합니다.

아래의 Key는 예시이므로, 필요하신 Key를 비슷한 형식으로 생성하시면 됩니다.

Deployment Common 키 생성

  • Deployment에서 필요한 공용 Key를 생성하도록 하겠습니다.

vim terraform/kms/dayone-prod/prod_apnortheast2/deployment_common.tf
# AWS kms Key
resource "aws_kms_key" "deployment_common" {
  description         = "KMS key for common secrets in ${var.aws_region}."
  enable_key_rotation = true
}

# Alias for custom key
resource "aws_kms_alias" "deployment_common_kms_alias" {
  name          = "alias/deployment-common"
  target_key_id = aws_kms_key.deployment_common.key_id
}

Output 정리

  • Output은 타 리소스 생성 시에 자주 사용되기 때문에 일정한 규칙을 가지고 정리하는 것이 좋습니다.

  • Outputs은 공용으로 사용할 수 있으므로 상위 폴더로 뺀 후에 Soft Link를 사용하시면 편리합니다.

    • ln -s ../outputs.tf

  • 여기서 예시로 사용한 규칙은 아래와 같습니다.

aws_kms_key_<env>_<region>_<key_name>_arn

vim terraform-workshop/terraform/kms/dayone-prod/outputs.tf
#######
## - It is better to use name of output with certain rules.
## - Example is like this
## 
## Rule : `aws_kms_key_<env>_<region>_<key_name>_arn`
## 
#######
output "aws_kms_key_prod_apne2_deployment_common_arn" {
  description = "Key for deployment"
  value       = aws_kms_key.deployment_common.arn
}

생성을 완료하면 아래와 같이 ARN 리스트를 보실 수 있습니다.

Outputs:

aws_kms_key_prod_apne2_deployment_common_arn = arn:aws:kms:ap-northeast-2:xxxx:key/<key_id>
...

Global Variable로 등록

  • 타 리소스에서 손쉽게 사용할 수 있도록 KMS의 backend 정보를 글로벌 변수에 등록해 놓습니다.

vim terraform/variables/var_global.tf
# Remote State that will be used when creating other resources
# You can add any resource here, if you want to refer from others
variable "remote_state" {
  default = {
    ( ... 생략 ... )

    # AWS KMS
    kms = {
      prod = {
        apne2 = {
          region = "ap-northeast-2"
          bucket = "dayone-prod-apnortheast2-tfstate"
          key    = "dayone/terraform/kms/dayone-prod/prod_apnortheast2/terraform.tfstate" 
        }
      }
    }
  }
}

Last updated