まずは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
のようにしてシークレットの値を環境変数として使用します。
コメント