码头工人命令和具有多行输入的弹性云服务器



>我在ECS 任务定义中将命令定义为以下内容:

compact,--wait,--http-address=0.0.0.0:10912,--objstore.config=<YAML FILE>

但是,我找不到将 YAML 文件传递到此命令位置的方法。除了在 YAML 文件中,我还需要通过环境变量添加一些敏感数据(访问/密钥,如下所示)

下面是 YAML 文件的示例:

type: S3
config:
bucket: mybucket
access_key: <access_key>
secret_key: <secret_key>
endpoint: s3.us-east-2.amazonaws.com
insecure: true

有什么建议吗?

谢谢。。。

我的方法是覆盖图像的入口点。我将入口点替换为非秘密环境变量导出和一个run.sh(所有 base64 编码的不带换行符),该对所有内容进行解码并调用作为入口点的前一个命令。

对于秘密数据,我使用secrets而不是环境变量。

下面是生产中的示例。我使用Terraform,但想法是一样的。

入口点:

entryPoint: [ "/bin/sh", "-c", join(" ", [
"export DOMAIN='domain.com';",
"export VICTORIA_YML=${base64encode(file("${path.module}/files/promstack/victoria/victoria.yml"))};",
"echo '${base64encode(file("${path.module}/files/promstack/victoria/run.sh"))}' | base64 -d | sh;"
])],

run.sh:

#!/bin/sh
set -x
require () {
if [ ! "$1" ]; then 
echo "ERROR: var not found"
exit 1 
fi 
}
expand () {
var_name="${1}"
file="${2}"
eval var="$$var_name"
sed -i "s+${${var_name}}+${var}+g" ${file}
sed -i "s+$${var_name}+${var}+g" ${file}
}
# ==============================================================================
require ${DOMAIN}
require ${VICTORIA_YML}
echo ${VICTORIA_YML} | base64 -d > /tmp/victoria.yml
chmod 666 /tmp/victoria.yml
expand DOMAIN /tmp/victoria.yml
arguments="
--storageDataPath=/storage 
--loggerFormat=json 
--promscrape.config=/tmp/victoria.yml 
--promscrape.config.strictParse 
--promscrape.fileSDCheckInterval=15s 
"
/bin/sh -c "/victoria-metrics-prod ${arguments}"

根据我的评论,我认为可以通过在模板文件中使用 ECS 任务定义data template_file来完成一些事情。ECS 任务模板文件示例:

[
{
"name": "${service_name}",
"image": "${service_image}",
"essential": true,
"portMappings": [
{
"containerPort": ${service_port}
}
],
"secrets": [
${service_secrets}
],
"dockerLabels": {
"traefik.port" : "${service_port}",
"traefik.enable" : "true",
"traefik.frontend.rule": "Host:${service_hosts}",
"traefik.frontend.passHostHeader": "true",
"traefik.frontend.headers.SSLRedirect": "true",
"traefik.frontend.headers.SSLProxyHeaders": "X-Forwarded-Proto: https"
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "${service_awslogs}",
"awslogs-region": "${cluster_region}",
"awslogs-stream-prefix": "ecs"
}
}
}
]

每个以${service_*}开头的变量都将使用以下选项进行填充:

data "template_file" "app-task-definition" {
template = file("task-definitions/app.json.tpl")
vars = {
cluster_region = var.cluster_region
service_name    = var.application.name
service_port    = var.application.port
service_image   = var.app_image
service_hosts   = join(", ", var.app_traefik_hosts)
service_cluster = var.cluster_name
service_secrets = join(", ", module.app-secrets.rendered)
service_awslogs = var.aws_ssm_prefix
}
}

我认为您还可以为要作为任务定义的一部分传递的 YML 文件定义一个位置。最后但并非最不重要的一点是,您将使用数据资源作为容器定义的输入:

container_definitions = data.template_file.app-task-definition.rendered

对于传递密钥,定义了一个自定义模块,稍后用于在 SSM 中传递和存储值:

variable "aws_ssm_parameter_list" {
type = list
}
variable "service_prefix" {
type = string
}
data "template_file" "service_secrets" {
count = length(var.aws_ssm_parameter_list)
template = <<EOF
{
"name": "$${secret_name}",
"valueFrom": "$${secret_path}"
}
EOF
vars = {
secret_name = var.aws_ssm_parameter_list[count.index].name
secret_path = "${var.service_prefix}/${var.aws_ssm_parameter_list[count.index].name}"
}
}
output "rendered" {
value = data.template_file.service_secrets.*.rendered
}

最新更新