Terraform和AWS ECS:类似于Kubernetes或Docker swarm的配置/秘密

时间:2020-06-25 13:09:14

标签: terraform amazon-ecs

AWS ECS生态系统中是否有与Kubernetes / Docker Swarm机密相似的东西?我知道使用SSM参数存储区或S3存储桶的选项,但它们的可用性在Kubernetes或Swarm解决方案中无法比拟。

每个密钥的SSM参数存储限制为4/8 KB,这使得它无法用于更大的配置文件。 Kubernetes每个秘密最多允许1 MB。

SSM PS和S3都要求我为不支持通过环境变量进行配置的所有内容维护唯一的映像(这是我知道的将配置数据放入ECS容器中的唯一方法)。

我错过了一个显而易见的简单解决方案吗?

当前,我的工作流程如下:

  1. 使用base64编码创建SSM参数
  2. 创建将环境变量解析为目标文件(例如nginx.conf)的图像(例如nginx),然后调用默认入口点并传递任何参数。
  3. 在我的Terraform ECS任务定义中使用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;"]

1 个答案:

答案 0 :(得分:0)

我找到了我现在很满意的解决方案:

这是我如何使用Terraform / AWS ECS管理配置/秘密的方法

基本思想如下:我们将没有敏感数据的配置文件存储在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