使用 link 和 AWS-Lambda 启动 AWS 实例
Start AWS instance using a link and AWS-Lambda
我想给我的客户一个(密码保护)link,这样打开它就会启动一个 AWS 实例。是否可以在不经常 运行 另一个实例的情况下使用 AWS-Lambda 来做到这一点?
是的,例如这里是一个将启动实例的函数:
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 函数(类似于上面的 - 来自下面的 link),您可以在 AWS 中定义一个 AWS API 端点并让它调用 lambda 函数。
这个 link 可能会帮助您完成一些您想做的事情(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 lambda 最大执行时间为 5 分钟,一个实例可能需要超过 5 分钟才能进入 'running' 状态,因此您应该在函数代码中处理此事件
- AWS Api 网关与 cognito 集成以进行请求身份验证,而无需实施基本身份验证。
- 您还可以将参数传递给您的调用,以便 api 可以获得实例 ID 或标记作为参数。
希望对您有所帮助。
G.
不幸的是@E.J。 Brennan 的回答要求在身份验证请求中传递 HTTP headers,而我的客户不是技术人员,不会使用 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
选项卡并从 selecting API gateway
时,这将不起作用菜单,因为这将使用 ANY
方法创建资源。我们需要手动完成,创建一个资源,然后创建一个 GET
方法,然后将它链接到我们的函数。
接下来,我们需要告诉 AWS API 我们正在传递一个名为 mykey
的参数。我们需要 select 我们的 GET
方法,然后 Integration Request
,在底部应该有一个 Body Mapping Templates
的选项。如果您没有看到它,请确保该方法确实是 GET
而不是 ANY
(我被困在这个问题上有一段时间了)。然后新建一个模板:
{
"mykey" : "$input.params('mykey')"
}
接下来,我们selectMethod Request
在URL Query String Parameters
中添加mykey
。
我们还需要创建一个阶段并在那里添加资源,无论如何在部署之前我们都会被提示这样做。
最后我们需要部署 API,瞧,客户端现在可以点击:
https://XX.execute-api.REGION.amazonaws.com/prod/startServers?mykey=top
诚然,hard-coding 密码不是最好的方法 security-wise,但我认为考虑到要求,这是一个公平的妥协。
我想给我的客户一个(密码保护)link,这样打开它就会启动一个 AWS 实例。是否可以在不经常 运行 另一个实例的情况下使用 AWS-Lambda 来做到这一点?
是的,例如这里是一个将启动实例的函数:
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 函数(类似于上面的 - 来自下面的 link),您可以在 AWS 中定义一个 AWS API 端点并让它调用 lambda 函数。
这个 link 可能会帮助您完成一些您想做的事情(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 lambda 最大执行时间为 5 分钟,一个实例可能需要超过 5 分钟才能进入 'running' 状态,因此您应该在函数代码中处理此事件
- AWS Api 网关与 cognito 集成以进行请求身份验证,而无需实施基本身份验证。
- 您还可以将参数传递给您的调用,以便 api 可以获得实例 ID 或标记作为参数。
希望对您有所帮助。
G.
不幸的是@E.J。 Brennan 的回答要求在身份验证请求中传递 HTTP headers,而我的客户不是技术人员,不会使用 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
选项卡并从 selecting API gateway
时,这将不起作用菜单,因为这将使用 ANY
方法创建资源。我们需要手动完成,创建一个资源,然后创建一个 GET
方法,然后将它链接到我们的函数。
接下来,我们需要告诉 AWS API 我们正在传递一个名为 mykey
的参数。我们需要 select 我们的 GET
方法,然后 Integration Request
,在底部应该有一个 Body Mapping Templates
的选项。如果您没有看到它,请确保该方法确实是 GET
而不是 ANY
(我被困在这个问题上有一段时间了)。然后新建一个模板:
{
"mykey" : "$input.params('mykey')"
}
接下来,我们selectMethod Request
在URL Query String Parameters
中添加mykey
。
我们还需要创建一个阶段并在那里添加资源,无论如何在部署之前我们都会被提示这样做。 最后我们需要部署 API,瞧,客户端现在可以点击:
https://XX.execute-api.REGION.amazonaws.com/prod/startServers?mykey=top
诚然,hard-coding 密码不是最好的方法 security-wise,但我认为考虑到要求,这是一个公平的妥协。