AWS JAVA SDK 获取任务的公网IP

问题描述 投票:0回答:3

我有一个小问题。我正在通过 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
3个回答
7
投票

您将需要进行多个 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": "弹性网络接口", “状态”:“已连接”, “细节”: [ { "名称": "子网ID", “值”:“子网-xxxxx” }, { "名称": "网络接口ID", “值”:“eni-e5aa89a3” }, { "名称": "mac地址", “值”:“xxxxx” }, { “名称”:“私有IPv4地址”, “值”:“172.31.94.215” } ] } ],

  1. 从上面的 API 响应中获取 networkInterfaceId 并进行以下调用。
  2. 调用 AWS EC2 描述网络接口。 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", “公共IP”:“52.xx.xx.xx” } ] }

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

0
投票

任务元数据端点将允许您获取有关容器的网络信息。如果您要附加 EIP,则必须使用容器中的 IPv4 来通过 SDK 查找 EIP。

看起来现在有元数据服务v3了!


0
投票

使用 AWS Java SDK 版本 1.12.686 (2024),您应该执行下述操作来获取与正在运行的任务关联的公共 IP:


private static final String API_ACCESS_KEY = "AK........";
private static final String API_PASSWORD_KEY = "xxxx.....";

AmazonECS ecsClient = AmazonECSClientBuilder.standard()
                                                .withCredentials(new AWSStaticCredentialsProvider(getAwsCredential(API_ACCESS_KEY, API_PASSWORD_KEY)))
                                                .withRegion(DEFAULT_AWS_REGION)
                                                .build();
        ListClustersResult clusters = ecsClient.listClusters();
        for (String clusterArn : clusters.getClusterArns()) {
            ListTasksRequest tasksRequest = new ListTasksRequest().withCluster(clusterArn).withServiceName("your-cluster-service-name");
            ListTasksResult tasks = ecsClient.listTasks(tasksRequest);
            DescribeTasksRequest request = new DescribeTasksRequest().withTasks(tasks.getTaskArns()).withCluster(clusterArn);
            DescribeTasksResult response = ecsClient.describeTasks(request);
            for (Task task : response.getTasks()) {

                String eniId = task.getAttachments().get(0).getDetails().stream().filter(kv -> "networkInterfaceId".equals(kv.getName())).findFirst().orElse(new KeyValuePair()).getValue();
                if (StringUtils.hasText(eniId)) {
                    DescribeNetworkInterfacesRequest describeNetworkInterfacesRequest = new DescribeNetworkInterfacesRequest()
                            .withNetworkInterfaceIds(eniId);

                    AmazonEC2 amazonEC2 = AmazonEC2Client.builder().standard()
                            .withCredentials(new AWSStaticCredentialsProvider(getAwsCredential(API_ACCESS_KEY, API_PASSWORD_KEY)))
                            .withRegion(DEFAULT_AWS_REGION)
                            .build();
                    DescribeNetworkInterfacesResult networkResult = amazonEC2.describeNetworkInterfaces(describeNetworkInterfacesRequest);
                    log.info("*** Public IP: " + networkResult.getNetworkInterfaces().get(0).getAssociation().getPublicIp());
                }
            }
© www.soinside.com 2019 - 2024. All rights reserved.