Dans cet article, nous allons créer une clé multi region via Terraform, en créant
une Primary Key et ses Replica Keys, sans passer par la console.

Pré-requis Terraform

On va travailler avec plusieurs providers AWS, un par région.

provider "aws" {
  alias  = "primary"
  region = "eu-west-1"
}
 
provider "aws" {
  alias  = "replica"
  region = "eu-central-1"
}

Création de la Primary Multi-Region Key

data "aws_caller_identity" "current" {}
resource "aws_kms_key" "primary_mrk" {
  provider            = aws.primary
  description         = "Primary Multi-Region Key"
  multi_region        = true
  enable_key_rotation = true    
  # Key policy controlling who can use and manage this key
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "EnableRootAccountFullAccess"
        Effect = "Allow"
        Principal = {
          AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
        }
        Action   = "kms:*"
        Resource = "*"
      },
      # On peut ajouter des administrateurs de clé
      {
        Sid    = "AllowAdmins"
        Effect = "Allow"
        Principal = {
          AWS = var.key_admin_arns
        }
        Action = [
          "kms:Create*",
          "kms:Describe*",
          "kms:Enable*",
          "kms:List*",
          "kms:Put*",
          "kms:Update*",
          "kms:Revoke*",
          "kms:Disable*",
          "kms:Get*",
          "kms:Delete*",
          "kms:ScheduleKeyDeletion",
          "kms:CancelKeyDeletion"
        ]
        Resource = "*"
      },
      # Ici on peut ajouter la liste des users qui vont utiliser la clé
      {
        Sid    = "AllowUsers"
        Effect = "Allow"
        Principal = {
          AWS = var.key_user_arns
        }
        Action = [
          "kms:Encrypt",
          "kms:Decrypt",
          "kms:ReEncrypt*",
          "kms:GenerateDataKey*",
          "kms:DescribeKey"
        ]
        Resource = "*"
      }
    ]
  })
  
  tags = {
    Name        = "vprisme-key"
  }
}
resource "aws_kms_alias" "primary_alias" {
  provider      = aws.primary
  name          = "alias/mrk-global-ebs"
  target_key_id = aws_kms_key.primary_mrk.key_id
}

Création du Replica dans une autre région

Ensuite, on crée un replica basé sur la primary.

resource "aws_kms_replica_key" "replica_mrk" {
  provider        = aws.replica
  description     = "Replica of Primary MRK"
  primary_key_arn = aws_kms_key.primary_mrk.arn
}
resource "aws_kms_alias" "replica_alias" {
  provider      = aws.replica
  name          = "alias/mrk-global-ebs"
  target_key_id = aws_kms_replica_key.replica_mrk.key_id
}

Et on peut appliquer: terraform apply

Vérification côté AWS

Dans les deux régions :

  • Les clés auront un ID commençant par mrk-
  • Elles apparaîtront liées dans l’onglet Regionality