AWS Secrets Managerの値をECSとRDSで使う

まずはSecrets Managerでシークレットを作成して、シークレットの名前を「project/prod」として作成します。

そして、project/prodシークレットの中に環境変数を入れていきます。
今回は、コンソールからシークレットの変数を保存したことを想定します。

すでに保存してあるシークレットをterraformで以下のように取得します。

data "aws_secretsmanager_secret" "this" {
  # Secrets Manager に登録したときの名前
  name = "project/prod"
}

data "aws_secretsmanager_secret_version" "secrets" {
  secret_id     = data.aws_secretsmanager_secret.this.id
}


# Secrets Manager から値を取得してセットする
locals {
  # yaml の場合は yamldecode を使用する
  secrets = jsondecode(
    data.aws_secretsmanager_secret_version.secrets.secret_string
  )
}

# Secrets Manager から取得した値をターミナルに表示して確認
# output "secrets" {
#   sensitive = false
#   value = local.secrets
# }
目次

RDSを作成時にシークレットを使用する

RDSを作成するときにdatabase_nameなどでシークレットを使用する方法は以下の通りです。
取得したシークレットの値を入れます。

####################################################
# RDS Cluster
####################################################

resource "aws_rds_cluster" "this" {
  cluster_identifier = "${local.app_name}-database-cluster"

  db_subnet_group_name   = ...
  vpc_security_group_ids = ...

  engine = "aurora-mysql"
  engine_version = "8.0.mysql_aurora.3.04.1"
  port   = "3306"

  database_name   = local.secrets.database_name
  master_username = local.secrets.database_user
  master_password = local.secrets.database_password

  skip_final_snapshot = true

  db_cluster_parameter_group_name = ...
}

ECSの環境変数にシークレットを使用する

ECSの環境変数にシークレットの値を使用する方法は以下の通りです。

####################################################
# ECS Task Definition
####################################################
resource "aws_ecs_task_definition" "frontend" {
  family                   = ...
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = 256
  memory                   = 512
  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
  task_role_arn            = aws_iam_role.ecs_task_execution_role.arn
  container_definitions    = jsonencode([
    {
      name             = local.frontend_task_container_name
      image            = ...
      portMappings     = [{ containerPort : 3000 }]
      secrets = [
        {
          name: "DATABASE_URL"
          valueFrom: "${data.aws_secretsmanager_secret.this.arn}:database_url::"
        },
        ...
      ]
      ...
    },
   
  ])
}

${data.aws_secretsmanager_secret.this.arn}:database_url::のようにしてシークレットの値を環境変数として使用します。

CodeBuildの環境変数にシークレットを使用する

CodeBuildの環境変数にシークレットの値を使用する方法は以下の通りです。

resource "aws_codebuild_project" "build" {
  name         = "${local.app_name}-buildproject"
  service_role = aws_iam_role.build_role.arn
  artifacts {
    type = "CODEPIPELINE"
  }
  environment {
    compute_type = "BUILD_GENERAL1_SMALL"
    image = "aws/codebuild/standard:7.0"
    type         = "LINUX_CONTAINER"
    privileged_mode = true
    
    environment_variable {
      name= "DATABASE_URL"
      value = "${data.aws_secretsmanager_secret.this.name}:database_url"
      type = "SECRETS_MANAGER"
    }
    ...
  }
  ...
}

${data.aws_secretsmanager_secret.this.name}:database_urlのようにしてシークレットの値を環境変数として使用します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

目次