【问题标题】:AWS JAVA SDK get public IP of TaskAWS JAVA SDK 获取任务的公共 IP
【发布时间】:2018-11-11 10:58:30
【问题描述】:

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

但是现在想通过SDK获取公网IP,不知道怎么弄。

这是我目前已有的代码。

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

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

【问题讨论】:

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


    【解决方案1】:

    您需要进行多次 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", “状态”:“附加”, “细节”: [ { “名称”:“子网 ID”, “值”:“子网-xxxx” }, { "name": "networkInterfaceId", “价值”:“eni-e5aa89a3” }, { “名称”:“mac地址”, “价值”:“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--

    { “网络接口”:[ { “协会”: { “IpOwnerId”:“亚马逊”, “PublicDnsName”:“ec2-52-xx-xx-xx.compute-1.amazonaws.com”, “PublicIp”:“52.xx.xx.xx” } ] }

    1. 注意 - 您需要执行第 2 步,直到任务启动并运行,否则您将无法获得所需的结果。所以可能,在 runTask 之后休眠几秒钟,看看 Task 是否启动并运行,然后执行剩余的步骤。

    【讨论】:

      【解决方案2】:

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

      Looks like there's a metadata service v3 now!

      【讨论】:

      • 我相信这只会返回私有 IP,或者至少文档只显示私有 IP。现在也有v4 metadata endpoint
      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多