首页 > 解决方案 > 如何将区域作为 aws java lambda 函数的查询参数传递

问题描述

我是 AWS lambda 的新手。我正在使用 AWS java Lambda 函数创建 ec2 实例,其中我试图使用 API 网关动态传递区域。

我将该区域作为查询参数字符串传递。我不确定如何在 lambda 函数中获取查询参数。我已经完成了与此类似的问题,但无法理解如何实现。

请找到以下 java lambda 函数:

package com.amazonaws.lambda.demo;

    import java.util.List;

    import org.json.simple.JSONObject;

    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.DescribeInstanceStatusRequest;
    import com.amazonaws.services.ec2.model.DescribeInstanceStatusResult;
    import com.amazonaws.services.ec2.model.Instance;
    import com.amazonaws.services.ec2.model.InstanceNetworkInterfaceSpecification;
    import com.amazonaws.services.ec2.model.InstanceStatus;
    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;
    import com.amazonaws.services.lambda.runtime.events.S3Event;
    import com.amazonaws.services.s3.AmazonS3;
    import com.amazonaws.services.s3.AmazonS3ClientBuilder;


    public class LambdaFunctionHandler implements RequestHandler<S3Event, String> {
         private static final AWSCredentials AWS_CREDENTIALS;
            static String ACCESS_KEY="XXXXXXXXXX";
            static String SECRET_KEY="XXXXXXXXXXXXXXXX";

            static {
                // Your accesskey and secretkey
                AWS_CREDENTIALS = new BasicAWSCredentials(
                        ACCESS_KEY,
                        SECRET_KEY
                );
            }
        private AmazonS3 s3 = AmazonS3ClientBuilder.standard().build();

        public LambdaFunctionHandler() {}

        // Test purpose only.
        LambdaFunctionHandler(AmazonS3 s3) {
            this.s3 = s3;
        }


        @Override
        public String handleRequest(S3Event event, Context context) {
            context.getLogger().log("Received event: " + event);


            // Set up the amazon ec2 client
            AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(AWS_CREDENTIALS))
                    .withRegion(Regions.EU_CENTRAL_1)
                    .build();

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

            RunInstancesResult runInstancesResult = ec2Client.runInstances(runInstancesRequest);

            Instance instance = runInstancesResult.getReservation().getInstances().get(0);
            String instanceId = instance.getInstanceId();
            String instanceip=instance.getPublicIpAddress();

            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", "SampleLambdaEc2"));
            ec2Client.createTags(createTagsRequest);

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

            ec2Client.startInstances(startInstancesRequest);




        /*// Stopping the Instance

            StopInstancesRequest stopInstancesRequest = new StopInstancesRequest()
                      .withInstanceIds(instanceId);

                    ec2Client.stopInstances(stopInstancesRequest);*/

            //describing the instance
            DescribeInstanceStatusRequest describeInstanceRequest = new DescribeInstanceStatusRequest().withInstanceIds(instanceId);
            DescribeInstanceStatusResult describeInstanceResult = ec2Client.describeInstanceStatus(describeInstanceRequest);




           List<InstanceStatus> state = describeInstanceResult.getInstanceStatuses();
           while (state.size() < 1) { 
               // Do nothing, just wait, have thread sleep if needed
               describeInstanceResult = ec2Client.describeInstanceStatus(describeInstanceRequest);
               state = describeInstanceResult.getInstanceStatuses();
           }
           String status = state.get(0).getInstanceState().getName();

           System.out.println("status"+status);
           JSONObject response=new JSONObject();

           response.put("instanceip", instanceip);
           response.put("instancestatus", status);

           System.out.println("response=>"+response);


        return response.toString();
        }
    }

我想传递查询参数而不是Regions.EU_CENTRAL_1

// Set up the amazon ec2 client
            AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard()
                    .withCredentials(new AWSStaticCredentialsProvider(AWS_CREDENTIALS))
                    .withRegion(Regions.EU_CENTRAL_1)
                    .build();

请在下面找到 API 配置:

在此处输入图像描述

任何关于如何实现这一目标的建议都会非常有帮助。提前致谢。

标签: aws-lambdaaws-java-sdk

解决方案


你好吗?

如果您想获取这些查询参数,您可能需要使用 Lambda 代理集成。

这样,您将获得一个函数APIGatewayProxyRequestEvent,您可以执行一个Map<String, String> getQueryStringParameters()操作。

您需要声明您的处理程序,如:

public class APIGatewayHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
 /// You cool awesome code here! 
}

这样,您的方法将如下所示:

@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {

     Map<String, String> params = event.getQueryStringParameters();
     Optional<String> region = Optional.ofNullable(params.get("region"));
     // Create EC2 instance. You may need to parse that region string to AWS Region object. 
}

让我知道这是否适合你!


推荐阅读