【问题标题】:Is there a way to automatically schedule the bootup of a Lightsail instance every 3 months?有没有办法每 3 个月自动安排一次 Lightsail 实例的启动?
【发布时间】:2018-05-22 20:19:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: amazon-web-services cron aws-cli certbot amazon-lightsail


    【解决方案1】:

    我能想到两种选择。可能还有更多。

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

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

    aws lightsail start-instance

    从停止状态启动特定 Amazon Lightsail 实例。到 重启实例,使用重启实例操作。

    在我看来,在你的实例上安装一个代理只是为了发送一个命令。

    【讨论】:

    • 感谢您的建议,非常有帮助。
    • @helloV JFYI - SSM 代理已与 AWS 的大多数 AMI 预打包。 OP 的 lightsail 实例很可能会使用 AWS Linux 作为他们的 AMI。
    【解决方案2】:

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

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

    一些先决条件:

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

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

    现在使用 AWS 开发工具包编写您的 lambda 函数,它会像一个魅力一样工作。 如果您担心成本,除非您运行一个脚本的母亲,否则您应该属于免费套餐,因为您每月可以获得 400 GB 秒的计算时间。

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

    PS:我提到了很多 EC2,我知道您正在使用 lightsail,但由于它只是 EC2 的包装器,我想可以使用相同的功能,如果我错了,请纠正我。

    【讨论】:

    • 非常感谢,还有很多细节可以帮助我解决这个问题。
    • 如果 Lightsail 实例启动并执行所需的任何操作需要超过 5 分钟的时间,那么使用您建议的方法将很难实现。更好的方法是按照 helloV 的建议,让 Lambda 函数简单地启动实例,然后让实例在启动时自动运行任务,并在任务完成后自行关闭。
    • 我也同意@helloV 的观点,即使用 AWS DataPipeline 的设置会更加流畅。它会迫使您从 lightsail 转到 ec2,但由于仅运行一个小时的成本几乎为零(在 us-east-1 中为 0.0116 美元/小时),因此这是一个同样可行的选择。
    【解决方案3】:

    为此,我们需要从不同的 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 事件规则。

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

    【讨论】:

    • 我应该创建单独的工作吗?
    • 以及如何添加这些工作
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多