AWS JAVA SDK获取任务的公共IP

时间:2018-10-23 09:54:50

标签: java amazon-web-services ip amazon-ecs aws-fargate

我有一个小问题。我正在通过JAVA SDK启动任务(泊坞窗容器)。这很好。

但是现在我想通过SDK来获取公共IP,不知道如何。

这是到目前为止我现有的代码。

RunTaskRequest request = new RunTaskRequest()
                .withCluster("JuiceShop")
                .withTaskDefinition("startJuiceShop:1")
                .withNetworkConfiguration(networkConfiguration)
                .withLaunchType("FARGATE");
RunTaskResult response = client.runTask(request);

响应包含容器,但尚未连接网络设备。是否有一种简单的方法来获取公共IPV4?

2 个答案:

答案 0 :(得分:3)

您将需要进行多个AWS API调用以获得公共IPv4地址。步骤如下。

  1. 一旦执行taskRun操作。保持taskFullArn处于输出状态。
  2. 使用上面的taskArn和群集名称,进行describeTasks操作调用。 https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ecs/AmazonECS.html#describeTasks-com.amazonaws.services.ecs.model.DescribeTasksRequest-

示例-

AmazonECS client = AmazonECSClientBuilder.standard().build();
DescribeTasksRequest request = new DescribeTasksRequest().withTasks("c5cba4eb-5dad-405e-96db-71ef8eefe6a8");
DescribeTasksResult response = client.describeTasks(request);
  1. 以上API将为您提供包含网络附件详细信息的响应。
  

“附件”:[                       {                           “ id”:“ xxxxx-d02c-4a9d-ae79-xxxxxxx”,                           “ type”:“ ElasticNetworkInterface”,                           “ status”:“ ATTACHED”,                           “细节”: [                               {                                   “ name”:“ subnetId”,                                   “值”:“ subnet-xxxxx”                               },                               {                                   “ name”:“ networkInterfaceId”,                                   “值”:“ eni-e5aa89a3”                               },                               {                                   “ name”:“ macAddress”,                                   “值”:“ xxxxx”                               },                               {                                   “ name”:“ privateIPv4Address”,                                   “值”:“ 172.31.94.215”                               }                           ]                       }                   ]

  1. 从上述API响应中获取networkInterfaceId并进行以下调用。
  2. 调用AWS EC2 describeNetworkInterfaces。 https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/AmazonEC2Client.html#describeNetworkInterfaces-com.amazonaws.services.ec2.model.DescribeNetworkInterfacesRequest-

示例-

AmazonEC2 client = AmazonEC2ClientBuilder.standard().build();
DescribeNetworkInterfacesRequest request = new DescribeNetworkInterfacesRequest().withNetworkInterfaceIds("eni-e5aa89a3");
DescribeNetworkInterfacesResult response = client.describeNetworkInterfaces(request);
  1. 以上应为DescriberNetworkInterfaceResult提供容器的PublicIp。 https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/ec2/model/NetworkInterfaceAssociation.html#getPublicIp--
  

{       “ NetworkInterfaces”:[           {               “协会”:{                   “ IpOwnerId”:“ amazon”,                   “ PublicDnsName”:“ ec2-52-xx-xx-xx.compute-1.amazonaws.com”,                   “ PublicIp”:“ 52.xx.xx.xx”               }       ]}

  1. 注意-您将需要执行第2步,直到任务启动并运行,否则您将无法获得预期的结果。因此,大概是在runTask之后休眠几秒钟,然后查看Task是否已启动并正在运行,然后执行其余步骤。

答案 1 :(得分:0)

task metadata endpoint将使您获取有关容器的网络信息。如果要附加EIP,则必须使用容器中的IPv4才能通过SDK查找EIP。

Looks like there's a metadata service v3 now!