我想给我的客户端一个(密码保护的)链接,这样打开它就会启动一个AWS实例。是否有可能使用AWS-Lambda而不经常运行另一个实例?
答案 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函数,然后运行实际代码来启动实例。
附加说明:
我希望这会有所帮助。
-G。
答案 2 :(得分:0)
不幸的是@ 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
资源{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
不可否认,对密码进行硬编码并不是安全方面的最佳方法,但我认为考虑到这些要求,这是一个公平的妥协。