【问题标题】:How to pass region as query param for aws java lambda function如何将区域作为 aws java lambda 函数的查询参数传递
【发布时间】:2019-06-17 12:17:05
【问题描述】:

我是 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-lambda aws-java-sdk


    【解决方案1】:

    你好吗?

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

    这样,您将获得一个APIGatewayProxyRequestEvent 函数,您可以执行一个Map&lt;String, String&gt; 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. 
    }
    

    让我知道这是否适合你!

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 2021-12-13
      • 2016-04-10
      • 2017-12-30
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2021-04-14
      相关资源
      最近更新 更多