使用 Terraform 检索 AWS FARGATE 任务的私有 IP

Retrieve Private Ip of AWS FARGATE task using Terraform

我需要提取 Fargate 任务的私有 Ip,并且需要在容器模板中将其作为参数传递给 COMMAND,以便应用程序可以 运行 在同一 IP 上。

我正在尝试向 运行 领事发送以下命令,但它要求输入 IP。

"command": [
   "consul agent -server -data-dir=/consul/data -bootstrap -ui -client=0.0.0.0 -bind=0.0.0.0"
],

不是0.0.0.0需要传私网IP地址,目前还没找到解决方法

已使用以下 terraform 脚本但不起作用:

 data "aws_network_interfaces" "consul_eni" {
    filter{
            values = [aws_subnet.private[0].id]
        }
      }

然后在变量部分,我将数据源传递为:

vars = {
         Interface_IP       = data.aws_network_interfaces.consul_eni.private_ip
       }

出现以下错误:

 line 20, in data "template_file" "consul_app":
 20:     Interface_IP       = data.aws_network_interfaces.consul_eni.ids

A data resource "aws_network_interfaces" "consul_eni" has not been declared in
the root module.

我不确定我是否完全理解您的用例。我的理解是,您 运行 Fargate 中的一项任务,并且想要找出任务本身的 IPv4 地址。

要实现此目的,您可以使用 AWS Docs 中所述的元数据服务。

您可以使用 curl 之类的工具来查询存储在环境变量 ECS_CONTAINER_METADATA_URI_V4 中的 URL,然后使用 jq 之类的工具来解析 JSON 看起来像这样的响应:

{
    "DockerId": "cd189a933e5849daa93386466019ab50-2495160603",
    "Name": "curl",
    "DockerName": "curl",
    "Image": "111122223333.dkr.ecr.us-west-2.amazonaws.com/curltest:latest",
    "ImageID": "sha256:25f3695bedfb454a50f12d127839a68ad3caf91e451c1da073db34c542c4d2cb",
    "Labels": {
        "com.amazonaws.ecs.cluster": "arn:aws:ecs:us-west-2:111122223333:cluster/default",
        "com.amazonaws.ecs.container-name": "curl",
        "com.amazonaws.ecs.task-arn": "arn:aws:ecs:us-west-2:111122223333:task/default/cd189a933e5849daa93386466019ab50",
        "com.amazonaws.ecs.task-definition-family": "curltest",
        "com.amazonaws.ecs.task-definition-version": "2"
    },
    "DesiredStatus": "RUNNING",
    "KnownStatus": "RUNNING",
    "Limits": {
        "CPU": 10,
        "Memory": 128
    },
    "CreatedAt": "2020-10-08T20:09:11.44527186Z",
    "StartedAt": "2020-10-08T20:09:11.44527186Z",
    "Type": "NORMAL",
    "Networks": [
        {
            "NetworkMode": "awsvpc",
            "IPv4Addresses": [
                "192.0.2.3"
            ],
            "AttachmentIndex": 0,
            "MACAddress": "0a:de:f6:10:51:e5",
            "IPv4SubnetCIDRBlock": "192.0.2.0/24",
            "DomainNameServers": [
                "192.0.2.2"
            ],
            "DomainNameSearchList": [
                "us-west-2.compute.internal"
            ],
            "PrivateDNSName": "ip-10-0-0-222.us-west-2.compute.internal",
            "SubnetGatewayIpv4Address": "192.0.2.0/24"
        }
    ],
    "ContainerARN": "arn:aws:ecs:us-west-2:111122223333:container/05966557-f16c-49cb-9352-24b3a0dcd0e1",
    "LogOptions": {
        "awslogs-create-group": "true",
        "awslogs-group": "/ecs/containerlogs",
        "awslogs-region": "us-west-2",
        "awslogs-stream": "ecs/curl/cd189a933e5849daa93386466019ab50"
    },
    "LogDriver": "awslogs"
}

网络下的数组包含有关连接到您的任务的所有网络接口的信息。

Consul 支持在 -bind-client 标志中使用 go-sockaddr 模板。您可以将地址指定为 -client="{{ GetPrivateIP }} -bind="{{ GetPrivateIP }}",这将导致 Consul 绑定到默认接口(即具有默认路由的接口)上的第一个私有 IP 地址。

有关更多 go-sockaddr 示例,请参阅 https://www.consul.io/docs/agent/options.html#_bind

添加以下选项效果很好:

 -bind='{{ GetInterfaceIP "eth0" }}'