使用链接和AWS-Lambda启动AWS实例

时间:2016-09-25 14:56:49

标签: amazon-web-services aws-lambda

我想给我的客户端一个(密码保护的)链接,这样打开它就会启动一个AWS实例。是否有可能使用AWS-Lambda而不经常运行另一个实例?

3 个答案:

答案 0 :(得分:3)

是的,例如,这里是一个启动实例的函数:

import boto3
# Enter the region your instances are in, e.g. 'us-east-1'
region = 'XX-XXXXX-X'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']

instances = ['X-XXXXXXXX']

def lambda_handler(event, context):

    ec2 = boto3.client('ec2', region_name=region)

    ec2.start_instances(InstanceIds=instances)

    print 'started your instances: ' + str(instances)

创建Lambda函数(类似于上面的 - 从下面的链接),您可以在AWS中定义AWS API端点并让它调用lambda函数。

此链接可能有助于您想要做的一些事情(lambda函数)。

https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/

答案 1 :(得分:1)

是的,你可以。您应该使用AWS lambda和AWS api网关的组合。 AWS api网关(gw)负责公开http网址,您可以选择让AWS api网关使用自定义授权程序处理身份验证。

Api网关可以触发AWS lambda函数,然后运行实际代码来启动实例。

附加说明:

  • 记住AWS lambda max执行时间是5分钟,一个实例可能需要5分钟以上才能进入'运行'因此,您应该在功能代码中处理此事件
  • AWS Api网关与cognito集成以进行请求身份验证,而无需实施基本身份验证。
  • 您还可以将参数传递给您的调用,以便api可以将实例ID或标记作为参数。

我希望这会有所帮助。

-G。

答案 2 :(得分:0)

不幸的是@ E.J。 Brennan的答案要求在身份验证请求中传递HTTP标头,而我的客户端不是技术人员,并且不使用curlPostman,他只需要一个简单的URL来点击即可启动实例。

因此,作为一种解决方法,我传递了一个查询参数:

import boto3
# Enter the region your instances are in, e.g. 'us-east-1'
region = 'xx'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
SECRET = "top"
KEY_ALIAS = "mykey"
instances = ['i-XXX', ...]

def lambda_handler(event, context):
    if not KEY_ALIAS in event:
        return "Missing key"
    if event[KEY_ALIAS] == SECRET:
        ec2 = boto3.client('ec2', region_name=region)
        ec2.start_instances(InstanceIds=instances)
        return 'Started servers. They will be available in 2 minutes.'
    else:
        return "Non-autorized"

为了使其工作,我们需要在API网关中配置端点。

重要提示:当转到lambda函数的Triggers标签并从菜单中选择API gateway时,这将无效,因为这将创建一个ANY资源{1}}方法。我们需要手动创建资源,然后创建GET方法,然后将其链接到我们的函数。

接下来,我们需要告诉AWS API我们正在传递一个名为mykey的参数。我们需要选择GET方法,然后选择Integration Request,在底部应该有Body Mapping Templates的选项。如果你没有看到它,请确保方法确实是GET而不是ANY(我已经坚持了一段时间)。然后创建一个新模板:

{
  "mykey" : "$input.params('mykey')"
}

接下来,我们选择Method Request并在mykey中添加URL Query String Parameters

我们还需要创建一个舞台并在那里添加资源,在部署之前我们会提示我们这样做。 最后我们需要部署API,瞧,客户端现在可以点击:

https://XX.execute-api.REGION.amazonaws.com/prod/startServers?mykey=top

不可否认,对密码进行硬编码并不是安全方面的最佳方法,但我认为考虑到这些要求,这是一个公平的妥协。