使用 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" }}'
我需要提取 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" }}'