使用链接和AWS-Lambda启动AWS实例
不幸的是,@ E.J。 Brennan的回答要求在身份验证请求中传递HTTP标头,而我的客户不是技术人员,并且不使用curl
或Postman
,他只需要一个简单的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 Request
和URL Query String Parameters
添加mykey
。
我们还需要创建一个舞台并在那里添加资源,在部署之前我们会提示您这样做。 最后,我们需要部署API,瞧,客户现在可以通过点击:
https://XX.execute-api.REGION.amazonaws.com/prod/startServers?mykey=top
诚然,硬编码密码是不是最好的方法安全明智的,但我认为这是一个公平的根据要求妥协。
是的,比如说这里是将启动一个实例的功能:
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/
当然可以。您应该使用AWS lambda和AWS api网关的组合。 AWS api网关(gw)负责公开一个http url,并且您可以选择让AWS api网关使用自定义授权人来处理身份验证。
Api网关可以触发AWS lambda函数,然后运行实际代码来启动实例。
其他注意事项:
- 裸记住AWS最大λ值执行时间为5分钟,实例可能需要超过5分钟,在“运行”状态获得,因此,你应该在你的函数代码 处理这个事件
- AWS Api网关集成cognito进行请求身份验证,无需实施基本身份验证。
- 您还可以将参数传递给您的调用,以便API可以获取实例ID或标记作为参数。
我希望这有助于。
G.
谢谢,我已经创建了该功能并从控制台进行了测试,但我在api端点上遇到了问题。我创建了一个API密钥,我如何将它传递给链接?即类似'URL?name = john&key = doe' – dimid
它需要在请求的头部,而不是在URL中。这可能有所帮助:https://docs.aws.amazon.com/apigateway/api-reference/making-http-requests/ –
Lambda必须具有创建EC2实例的权限:http://docs.aws.amazon.com /lambda/latest/dg/policy-templates.html。 –