2016-09-25 103 views

回答

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方法。我们需要手动完成,方法是创建一个资源,然后创建一个方法,然后将其链接到我们的函数。

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

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

接下来,我们选择Method RequestURL Query String Parameters添加mykey

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

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

诚然,硬编码密码是不是最好的方法安全明智的,但我认为这是一个公平的根据要求妥协。

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 API端点在AWS中并让它调用lambda函数。

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

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

+0

谢谢,我已经创建了该功能并从控制台进行了测试,但我在api端点上遇到了问题。我创建了一个API密钥,我如何将它传递给链接?即类似'URL?name = john&key = doe' – dimid

+0

它需要在请求的头部,而不是在URL中。这可能有所帮助:https://docs.aws.amazon.com/apigateway/api-reference/making-http-requests/ –

+0

Lambda必须具有创建EC2实例的权限:http://docs.aws.amazon.com /lambda/latest/dg/policy-templates.html。 –

1

当然可以。您应该使用AWS lambda和AWS api网关的组合。 AWS api网关(gw)负责公开一个http url,并且您可以选择让AWS api网关使用自定义授权人来处理身份验证。

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

其他注意事项:

  • 裸记住AWS最大λ值执行时间为5分钟,实例可能需要超过5分钟,在“运行”状态获得,因此,你应该在你的函数代码
  • 处理这个事件
  • AWS Api网关集成cognito进行请求身份验证,无需实施基本身份验证。
  • 您还可以将参数传递给您的调用,以便API可以获取实例ID或标记作为参数。

我希望这有助于。

G.