如何使用Terraform将docker swarm管理器令牌传递到AWS中的工作程序节点

时间:2019-12-12 16:15:41

标签: amazon-web-services docker terraform docker-swarm terraform-provider-aws

我正在尝试使用Terraform创建Docker Swarm集群,我创建了1个管理器和3个工作节点。我安装了Docker并启动了Docker Swarm并创建了管理器令牌。

如何将密钥从管理器转发到工作节点,所有在AWS中运行的服务器以及在本地计算机上运行terrafrom apply命令?

我有多个限制,因为我无法为此特定任务请求新服务。

对不起,我不得不使用动态IP,因为整个环境都是使用动态IP构建的,并且没有IP锁定到任何特定资源。

2 个答案:

答案 0 :(得分:1)

我通过以下步骤解决了这个问题:

  • AWS中主节点的静态ip。
  • 我在nodejs中创建了在主服务器上运行的简单api rest应用。 api接受来自其他节点的请求并返回令牌密钥。

这是我使用的基本代码:

const { exec } = require("child_process");

    const execFunction = (command, res, returnOutput) => {
        exec(command, (error, stdout, stderr) => {
            if (stdout) {
                returnOutput ? res.status(200).send(stdout) : res.sendStatus(204);
            }
            else if (stderr) {
                res.status(400).send({ error: stderr });
            }
            else if (error !== null) {
                res.status(400).send({ error: error });
            }
            else {
                res.sendStatus(500);
            }
        });
    };

    app.get("/api/dockerswarm/token/:type", (req, res) => {
        const { type } = req.params;

        if (!type || (type !== "worker" && type !== "manager")) {
            res.status(400).send({ message: 'invalid token type supplied (manager|worker)' });
        }
        else {
            const dockerCommand = `docker swarm join-token ${type} | sed -n 3p | grep -Po 'docker swarm join --token \\K[^\\s]*'`;
            execFunction(dockerCommand, res, true);
        }
    });

现在其他机器可以向主节点请求令牌,并且可以连接到Swarm(我在userdata中插入了代码,用于检查节点是否已在Swarm中,否则请求令牌)。

Here完整的代码(包括我在AWS Swarm中使用的一些其他文件)。

答案 1 :(得分:0)

群体管理器需要一种在初始化后将工作人员令牌传递给工作人员的方法。最好的方法是让群集管理器的userdata触发器触发生成令牌,并将其放入他们都可以访问的共享存储中。在AWS中,最简单的方法是使用AWS SSM Parameter Store,它允许您存储较小的字符串,可以选择加密并由常规IAM权限支持。

您需要通过IAM实例配置文件向swarm manager实例授予权限,以将令牌写入/swarm/token/worker之类,然后允许worker实例读取同一令牌。

然后,在经理的用户数据脚本中,您希望具有以下内容:

WORKER_TOKEN=$(docker swarm join-token worker)
aws ssm put-parameter --region us-west-2 --name '/swarm/token/worker' --type SecureString --value "${WORKER_TOKEN}"

然后,您希望在工作人员的userdata脚本中进行等效的读取和执行:

WORKER_TOKEN=$(aws ssm get-parameter --region us-west-2 --name '/swarm/token/worker' --with-decryption --query 'Parameter.Value' --output text)
eval "${WORKER_TOKEN}"

还有一个community module that has an example of how to run Docker Swarm on AWS,它依赖于将秘密令牌放入S3,然后使用userdata脚本在工作节点上检索它。这可能会给您更多有关如何使Swarm集群在AWS上良好运行的提示。