【问题标题】:Retrieve Private Ip of AWS FARGATE task using Terraform使用 Terraform 检索 AWS FARGATE 任务的私有 IP
【发布时间】:2025-12-22 23:50:07
【问题描述】:

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

我正在尝试以下命令来运行 consul,但它要求 IP。

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

需要传递私有IP地址而不是0.0.0.0,目前还没有找到任何解决方案。

已使用以下 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.

【问题讨论】:

    标签: amazon-web-services terraform consul aws-fargate


    【解决方案1】:

    添加以下选项效果很好:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我不确定我是否完全理解您的用例。我的理解是,您正在 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"
        }
        

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

        【讨论】:

        • 添加以下选项效果很好:bind='{{ GetInterfaceIP "eth0" }}'