如何在 ECS 任务中将 rds.DatabaseCluster 机密作为环境变量传递
How to pass rds.DatabaseCluster secrets as environment variable in a ECS Task
我正在尝试将 RDS Aurora 凭据设置为 ECS 任务的环境变量。
最初我将它作为 environments
上的明文传递。
我知道正确的方法是使用 secrets
但 ApplicationLoadBalancedTaskImageOptions
期望 Secret
和 rds.DatabaseCluster
returns 另一种类型。
在这种情况下管理凭据的正确方法是什么?
- db 是一个 rds.DatabaseCluster 实例
task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("sonarqube:8.2-community"),
container_port=9000,
# FIXME: by documentation this is the right way to pass creds, however this fail, the database secret is not the same type than the expected
# secrets={
# "sonar.jdbc.password": ecs.Secret.from_secrets_manager(self.db.secret)
# },
environment={
'sonar.jdbc.url': url,
"sonar.jdbc.username": username,
"sonar.jdbc.password": self.db.secret.secret_value_from_json("password").to_string() #plaintext, FIXME
}
)
如果您想将其作为秘密传递,您首先必须将该值存储在 AWS SecretsManager 或 AWS Parameter Store 中。然后,您从这两个服务之一传递秘密的 ARN,作为 ECS 任务定义中的值,ECS 将在实例化容器时自动从 SecretsManager 或 Parameter Store 中提取实际值。这已记录在案 here。
如果您想使用秘密存储中的值,那么它应该secrets
而不是环境变量。
用 secrets
替换环境变量,如下所示
"secrets": [
{
"name": "MY_KEY",
"valueFrom": "arn:aws:secretsmanager:us-west-2:12345656:secret:demo-0Nlyli"
}
]
只需放置 ARN,ECS 将在 运行 时间内注入值。
设置你需要的环境变量
"environment": [
{
"name": "KEY",
"value": "VALUE"
}
]
所以在你的情况下
"environment": [
{
"name": "sonar.jdbc.url",
"value": "some-url"
}
]
多棒啊!
我前两天发过一篇关于这个话题的文章:
在这里你可以清楚地看出使用秘密和环境变量之间的区别。
使用来自@mchlfchr 的 ts 示例,我在 python 中按如下方式工作
正在创建角色并授予对数据库凭据的读取权限
#Create iam Role for Task
self.task_role = iam.Role(
self,
id= "SonarTaskRole",
role_name= "SonarTaskRole",
assumed_by= iam.ServicePrincipal(service= "ecs-tasks.amazonaws.com"),
managed_policies= [
iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AmazonECSTaskExecutionRolePolicy")
]
)
#Grant permission to the Task to read secret from SecretsManager
self.db_secret.grant_read(self.task_role)
并作为秘密传递:
secrets={
"sonar.jdbc.username": ecs.Secret.from_secrets_manager(self.db_secret, field="username"),
"sonar.jdbc.password": ecs.Secret.from_secrets_manager(self.db_secret, field="password")
},
我正在尝试将 RDS Aurora 凭据设置为 ECS 任务的环境变量。
最初我将它作为 environments
上的明文传递。
我知道正确的方法是使用 secrets
但 ApplicationLoadBalancedTaskImageOptions
期望 Secret
和 rds.DatabaseCluster
returns 另一种类型。
在这种情况下管理凭据的正确方法是什么?
- db 是一个 rds.DatabaseCluster 实例
task_image_options=ecs_patterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("sonarqube:8.2-community"),
container_port=9000,
# FIXME: by documentation this is the right way to pass creds, however this fail, the database secret is not the same type than the expected
# secrets={
# "sonar.jdbc.password": ecs.Secret.from_secrets_manager(self.db.secret)
# },
environment={
'sonar.jdbc.url': url,
"sonar.jdbc.username": username,
"sonar.jdbc.password": self.db.secret.secret_value_from_json("password").to_string() #plaintext, FIXME
}
)
如果您想将其作为秘密传递,您首先必须将该值存储在 AWS SecretsManager 或 AWS Parameter Store 中。然后,您从这两个服务之一传递秘密的 ARN,作为 ECS 任务定义中的值,ECS 将在实例化容器时自动从 SecretsManager 或 Parameter Store 中提取实际值。这已记录在案 here。
如果您想使用秘密存储中的值,那么它应该secrets
而不是环境变量。
用 secrets
替换环境变量,如下所示
"secrets": [
{
"name": "MY_KEY",
"valueFrom": "arn:aws:secretsmanager:us-west-2:12345656:secret:demo-0Nlyli"
}
]
只需放置 ARN,ECS 将在 运行 时间内注入值。
设置你需要的环境变量
"environment": [
{
"name": "KEY",
"value": "VALUE"
}
]
所以在你的情况下
"environment": [
{
"name": "sonar.jdbc.url",
"value": "some-url"
}
]
多棒啊!
我前两天发过一篇关于这个话题的文章:
在这里你可以清楚地看出使用秘密和环境变量之间的区别。
使用来自@mchlfchr 的 ts 示例,我在 python 中按如下方式工作
正在创建角色并授予对数据库凭据的读取权限
#Create iam Role for Task
self.task_role = iam.Role(
self,
id= "SonarTaskRole",
role_name= "SonarTaskRole",
assumed_by= iam.ServicePrincipal(service= "ecs-tasks.amazonaws.com"),
managed_policies= [
iam.ManagedPolicy.from_aws_managed_policy_name("service-role/AmazonECSTaskExecutionRolePolicy")
]
)
#Grant permission to the Task to read secret from SecretsManager
self.db_secret.grant_read(self.task_role)
并作为秘密传递:
secrets={
"sonar.jdbc.username": ecs.Secret.from_secrets_manager(self.db_secret, field="username"),
"sonar.jdbc.password": ecs.Secret.from_secrets_manager(self.db_secret, field="password")
},