【问题标题】:How to create ec2 instance using java lambda function?如何使用 java lambda 函数创建 ec2 实例?
【发布时间】:2020-06-30 07:19:56
【问题描述】:

我能够在 Eclipse 中使用本地计算机上的 Java 创建 EC2 实例。 我面临的问题是我找不到使用 Java Lambda 函数创建 EC2 实例的方法。 有人可以帮帮我吗?

我正在使用的 lambda 函数:-

package com.ec2application.ec2application;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.ec2.AmazonEC2;
import com.amazonaws.services.ec2.AmazonEC2ClientBuilder;
import com.amazonaws.services.ec2.model.CreateTagsRequest;
import com.amazonaws.services.ec2.model.Instance;
import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification;
import com.amazonaws.services.ec2.model.RunInstancesRequest;
import com.amazonaws.services.ec2.model.RunInstancesResult;
import com.amazonaws.services.ec2.model.StartInstancesRequest;
import com.amazonaws.services.ec2.model.Tag;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class EC2UsingLambda implements RequestHandler<Object, String> 
{
    private static final AWSCredentials AWS_CREDENTIALS;

    static {
        // Your accesskey and secretkey
        AWS_CREDENTIALS = new BasicAWSCredentials(
                "myid",
                "key"
        );
    }


    public String handleRequest(Object input, Context context) 
    {
        context.getLogger().log("Input: " + input);

        // TODO: implement your handler
        // Set up the amazon ec2 client
        AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(AWS_CREDENTIALS))
                .withRegion(Regions.US_EAST_1)
                .build();

        // Launch an Amazon EC2 Instance
        RunInstancesRequest runInstancesRequest = new RunInstancesRequest().withImageId("ami-0080e4c5bc078760e")
                .withInstanceType("t2.micro") // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
                .withMinCount(1)
                .withMaxCount(1)
                .withKeyName("priyajdm")
                .withNetworkInterfaces(new InstanceNetworkInterfaceSpecification()
                        .withAssociatePublicIpAddress(true)
                        .withDeviceIndex(0)
                        .withSubnetId("subnet-02ffd56c277")
                        .withGroups("sg-0e93be4d"));

        RunInstancesResult runInstancesResult = ec2Client.runInstances(runInstancesRequest);

        Instance instance = runInstancesResult.getReservation().getInstances().get(0);
        String instanceId = instance.getInstanceId();
        System.out.println("EC2 Instance Id: " + instanceId);

        // Setting up the tags for the instance
        CreateTagsRequest createTagsRequest = new CreateTagsRequest()
                .withResources(instance.getInstanceId())
                .withTags(new Tag("Name", "demo"));
        ec2Client.createTags(createTagsRequest);

        // Starting the Instance
        StartInstancesRequest startInstancesRequest = new StartInstancesRequest().withInstanceIds(instanceId);

        ec2Client.startInstances(startInstancesRequest);
        return "EC2 Instance created";
    }

}

这是我使用的代码:- 这是我得到的错误:-

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /C:/Users/priyj_kumar/workspace/EC2Application/src/main/java/com/ec2application/ec2application/EC2UsingLambda.java:[16,45] package com.amazonaws.services.lambda.runtime does not exist
[ERROR] /C:/Users/priyj_kumar/workspace/EC2Application/src/main/java/com/ec2application/ec2application/EC2UsingLambda.java:[17,45] package com.amazonaws.services.lambda.runtime does not exist
[ERROR] /C:/Users/priyj_kumar/workspace/EC2Application/src/main/java/com/ec2application/ec2application/EC2UsingLambda.java:[19,40] cannot find symbol
  symbol: class RequestHandler
[ERROR] /C:/Users/priyj_kumar/workspace/EC2Application/src/main/java/com/ec2application/ec2application/EC2UsingLambda.java:[32,47] cannot find symbol
  symbol:   class Context
  location: class com.ec2application.ec2application.EC2UsingLambda
[INFO] 4 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

【问题讨论】:

  • 您的 AWS Lambda 可能没有这样做的权限。看看这里docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html
  • 我用一个简单的 hello world 函数尝试了同样的方法,它成功了。
  • @Priyaj,您是否尝试过使用 Lambda 创建 EC2 实例?如果是这样,您尝试过什么?遇到了什么问题?
  • 不,我刚刚尝试了一个返回 Hello world 的简单 lambda 函数。我已经用 Python 创建了 ec2 实例。
  • 您为什么认为运行hello world function 与需要像ec2:RunInstances 这样的授权的操作相同?

标签: java amazon-web-services amazon-ec2 aws-lambda


【解决方案1】:

您可以将调用给定服务的 Java API 调用封装在 Lambda 函数中。我们写了一篇文章,向您展示了如何使用给定的服务客户端创建一个调用 AWS 服务操作的 Lambda 函数。

然后在 AWS Steps 中使用 Lambda 函数来创建工作流程。如果您遵循本文档,您将看到从可以包装在 Lambda 函数中的代码成功调用 AWS 服务操作的模式。见:

https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/creating_serverless%20workflows

在您的使用案例中,您可以在 Lambda 函数中使用 EC2 服务客户端。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2020-06-26
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2011-11-30
    • 2015-07-13
    • 2020-01-28
    相关资源
    最近更新 更多