有没有办法每 3 个月自动安排 Lightsail 实例启动一次?

Is there a way to automatically schedule the bootup of a Lightsail instance every 3 months?

我希望使用 certbot auto 为我在 GitLab 页面上托管的网站自动更新我的 SSL 证书。我已经可以正常工作了,但是我必须让我的 Lightsail 实例持续 运行ning。

我只是在寻找一种每 3 个月自动启动我的 Lightsail 实例的方法,一旦启动 运行 一个小脚本,然后再次关闭。目前它的费用是我每月 5 美元,而且我每次只使用它几分钟。

有没有办法每 3 个月自动安排 Lightsail 实例启动一次?

我能想到两个选项。可能还有更多。

AWS Data Pipeline:每3个月安排一次shellactivity,选择微实例。指定 AWS CLI 命令以启动您的实例并让您的实例在完成其工作后发送停止实例命令。 成本:1 小时的微型实例。

AWS Lambda(首选):安排 Lambda 事件以每 3 个月启动您的实例。指定 AWS CLI 命令以启动您的实例并让您的实例在完成其工作后发送停止实例命令。 费用:无(可能在免费限额内)

aws lightsail start-instance

Starts a specific Amazon Lightsail instance from a stopped state. To restart an instance, use the reboot instance operation.

在我看来,在您的实例上安装代理只是为了发送命令是一种矫枉过正。

建议的方法:计划的 Lambda 函数,每 3 个月触发一次并执行 4 个步骤。

  1. 启动您的实例
  2. 使用 EC2 RunCommand API 在您的 lightsail 实例上远程执行命令
  3. 监控命令直到完成
  4. 关闭实例

一些先决条件:

  • 创建一个 Lambda 函数并授予它使用 IAM 角色的权限以使用 ssm:*ec2:startinstancesec2:stopinstances(这将允许您的 lambda 函数与您的 lightsail 实例通信并且还监视和发送命令。
  • 将 lambda 函数设为计划函数,这样您就可以每 3 个月自动触发一次
  • this
  • 这样在您的实例上安装 SSMAgent
  • 通过实例策略为您的实例授予 SSM 通信的适当 IAM 权限(这将允许实例与 AWS SSM 通信)

    "ec2messages:*","ssm:updateinstanceinformation","ssm:listassociations"

现在使用 AWS SDK 编写您的 lambda 函数,它会非常有效。 如果您担心成本,除非您 运行 一位脚本之母,否则您应该属于免费套餐,因为您每月可以获得 400 GB 秒的计算时间。

这意味着您可以每月免费 运行 使用 1GB 内存的 lambda 函数 400 秒。

PS:我经常提到 EC2,我知道您使用的是 lightsail,但因为它只是 EC2 的包装器,所以我想可以使用相同的功能,如果我错了请纠正我。

为此,我们需要借助不同的 AWS 服务,我们需要创建一个 Lambda 函数并编写自定义代码来启动和停止 LightSail 实例,然后使用 CloudWatch Events 为实例安排时间你想要的时间段。

下面是一个示例代码,您可以使用它来安排实例的停止和启动:

启动 LightSail 服务器的代码:

import json
import boto3
def lambda_handler(event, context):
    client = boto3.client('lightsail', region_name='REGION')
    response = client.start_instance(
    instanceName='NAME-OF-YOUR-LIGHTSAIL-SERVER'
)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

停止 LightSail 服务器的代码:

import json
import boto3
def lambda_handler(event, context):
    client = boto3.client('lightsail', region_name='REGION')
    response = client.stop_instance(
    instanceName='NAME-OF-YOUR-LIGHTSAIL-SERVER'
)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

注意**:确保编辑 REGION 和 NAME-OF-YOUR-LIGHTSAIL-SERVER

您可以使用上面的代码创建两个不同的 lambda 函数。

执行此操作后,您可以使用触发 Lambda 函数的 CloudWatch Events 规则。

请参考:https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Rule.html