AWS ECS生态系统中是否有与Kubernetes / Docker Swarm机密相似的东西?我知道使用SSM参数存储区或S3存储桶的选项,但它们的可用性在Kubernetes或Swarm解决方案中无法比拟。
每个密钥的SSM参数存储限制为4/8 KB,这使得它无法用于更大的配置文件。 Kubernetes每个秘密最多允许1 MB。
SSM PS和S3都要求我为不支持通过环境变量进行配置的所有内容维护唯一的映像(这是我知道的将配置数据放入ECS容器中的唯一方法)。
我错过了一个显而易见的简单解决方案吗?
当前,我的工作流程如下:
nginx.conf
)的图像(例如nginx),然后调用默认入口点并传递任何参数。secrets
。以下是Dockerfile和run.sh
#!/bin/sh
echo "version 1.0"
if [ -z ${NGINX_CONF} ]
then
echo "no settings received for nginx.conf, connecting with the default settings"
else
echo ${NGINX_CONF} | base64 -d > /etc/nginx/nginx.conf
echo "created /etc/nginx/nginx.conf"
fi
/docker-entrypoint.sh $@
FROM nginx:latest
COPY files/run.sh /bin/run.sh
ENTRYPOINT [ "/bin/run.sh" ]
CMD ["nginx", "-g", "daemon off;"]
答案 0 :(得分:0)
我找到了我现在很满意的解决方案:
基本思想如下:我们将没有敏感数据的配置文件存储在Terraform旁边的存储库中。机密存储在AWS参数存储中。为了在运行时将数据放入我们的容器中,我们修改了入口点。我们当然可以只创建修改后的映像,但是在我看来,这会带来很大的维护开销。使用入口点方法,我们可以继续使用原始图像。
缺点是我必须创建自定义入口点脚本。这意味着我必须找到我感兴趣的映像的Dockerfile,并提取用于启动映像中运行的实际进程的命令。
我有一个像这样的git存储库:
java.lang.IllegalArgumentException: Invalid input Tensor index: 1
at org.tensorflow.lite.NativeInterpreterWrapper.getInputTensor(NativeInterpreterWrapper.java:269)
at org.tensorflow.lite.NativeInterpreterWrapper.run(NativeInterpreterWrapper.java:136)
at org.tensorflow.lite.Interpreter.runForMultipleInputsOutputs(Interpreter.java:314)
at com.amitshekhar.tflite.TensorFlowImageClassifier.recognizeImage(TensorFlowImageClassifier.java:88)
├── files
│ └── promstack
│ ├── grafana
│ │ ├── default-datasources.yml
│ │ ├── grafana.ini
│ │ └── run.sh
│ ├── loki
│ │ └── run.sh
│ ├── nginx
│ │ ├── nginx.conf
│ │ └── run.sh
│ └── prometheus
│ ├── prometheus.yml
│ ├── rules-alerting.yml
│ ├── rules-recording.yml
│ └── run.sh
├── myscript.tf
└── variables.tf
脚本代表入口点。这是示例run.sh
:
run.sh
这里是Terraform脚本的一部分(确切地说是ECS容器任务定义):
#!/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 ${GRAFANA_INI}
require ${DEFAULT_DATASOURCES_YML}
require ${DOMAIN}
echo ${GRAFANA_INI} | base64 -d > /etc/grafana/grafana.ini
chmod 666 /etc/grafana/grafana.ini
expand DOMAIN /etc/grafana/grafana.ini
echo ${DEFAULT_DATASOURCES_YML} | base64 -d > /etc/grafana/provisioning/datasources/default.yml
chmod 666 /etc/grafana/provisioning/datasources/default.yml
su -s "/bin/sh" -c "/run.sh" grafana