如何在预定时间停止和重启我的测试或不重要的 AWS Elastic Beanstalk 环境?

3 分钟阅读
0

我想在预定的时间终止并重建我的测试或不重要的 AWS Elastic Beanstalk 环境。

简述

您可以使用 API 调用 terminate-environmentrebuild-environment 来停止并重启您的 Elastic Beanstalk 环境。您只能在环境终止后的六周(42 天)内重建已终止的环境。

要按计划执行这些调用,请在 Amazon CloudWatch Events 中配置事件,使其每天在特定时间启动 AWS Lambda 函数。然后,将这些 Lambda 函数配置为调用 Elastic Beanstalk API。

**重要信息:**终止 Elastic Beanstalk 环境后,您对该环境或其实例所做的任何带外更改都不会保留。记下终止时间,并在该时间之前完成所有使用该实例的工作。即使用户未连接到该实例,该实例也会在计划的时间终止。

您可以创建配置 AWS CloudFormation 模板,以执行以下解决方案中的所有操作。该模板必须为 Lambda 创建一个 AWS Identity and Access Management(IAM)角色。然后,该模板必须启动 Lambda 函数,停止 Lambda 函数,最后启动 CloudWatch 事件。

解决方案

先决条件

记下您的 Elastic Beanstalk 环境的 ID(EnvironmentId)。

**重要信息:**以下解决方案可以从您的 Elastic Beanstalk 环境和资源中删除所有服务生成的标签。

为您的 Lambda 函数创建一个 IAM 角色

1.为您的 Lambda 函数的 IAM 角色创建以下内联策略(例如 Lambda.json):

$ cat Lambda.json {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com"
        ]
      },
      "Action": [
        "sts:AssumeRole"
      ]
    }
  ]
}

2.使用策略创建 IAM 角色:

aws iam create-role --role-name elasticbeanstalk-lambda-role --assume-role-policy-document file://Lambda.json

3.记录 IAM 角色的 Amazon 资源名称(ARN)

4.将以下托管策略附加到 IAM 角色:

aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AdministratorAccess-AWSElasticBeanstalk --role-name elasticbeanstalk-lambda-role

创建 Lambda 函数部署包

1.要重启 Elastic Beanstalk 环境,请将以下代码粘贴到文本编辑器中:

import boto3envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.rebuild_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Restore environment %s' %str(envid[appid]))
             else:
                 print('Failed to Restore environment %s' %str(envid[appid]))

    except Exception as e:
        print(e)

**重要信息:**将 e-awsenvidid 替换为您的 Elastic Beanstalk 环境 ID。前面的代码示例与 Python 3.9 运行时系统兼容。

2.将代码另存为一个 Python 文件。例如: StartElasticBeanstalk.py

3.将这个 Python 文件压缩为 ZIP 文件。例如: StartElasticBeanstalk.zip

4.要终止 Elastic Beanstalk 环境,请将以下代码粘贴到文本编辑器中:

import boto3envid=['e-awsenvidid']
client = boto3.client('elasticbeanstalk')
def handler(event, context):
    try:
         for appid in range(len(envid)):
             response = client.terminate_environment(EnvironmentId=str(envid[appid].strip()))
             if response:
                 print('Terminating environment %s' %str(envid[appid]))
             else:
                 print('Failed to Terminate environment %s' %str(envid[appid]))

    except Exception as e:
        print(e)

**重要信息:**将 e-awsenvidid 替换为您的 Elastic Beanstalk 环境 ID。

5.将代码另存为一个 Python 文件。例如: StopElasticBeanstalk.py

6.将这个 Python 文件压缩为 ZIP 文件。例如: StopElasticBeanstalk.zip

创建 Lambda 函数

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新的 AWS CLI 版本

要创建用于停止和重启您的 Elastic Beanstalk 环境的 Lambda 函数,请在 AWS CLI 中运行以下命令:

aws lambda create-function \
--function-name StartElasticBeanstalk \
--zip-file fileb://file-path/StartElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StartElasticBeanstalk.handler \
--runtime python3.9 --region us-west-2

aws lambda create-function \
--function-name StopElasticBeanstalk \
--zip-file fileb://file-path/StopElasticBeanstalk.zip \
--role arn:aws:iam::012345678912:role/elasticbeanstalk-lambda-role \
--handler StopElasticBeanstalk.handler \
--runtime python3.9 --region us-west-2

**重要信息:**将 us-west-2 替换为您的 Elastic Beanstalk 环境所在的 AWS 区域。此外,在每条命令中提供部署包(StartElasticBeanstalk.zipStopElasticBeanstalk.zip)和 IAM 角色的 ARN 作为参数。

创建 CloudWatch 事件规则以启动 Lambda 函数

1.要启动和停止 Lambda 函数,请运行以下命令:

aws events put-rule --name "StartLambdaFunction" --schedule-expression "cron(0 8 * * ? *)" --region us-west-2aws events put-rule --name "StopLambdaFunction" --schedule-expression "cron(0 18 * * ? *)" --region us-west-2

注意:****--schedule-expression 属性需要使用 cron 语法。根据需要更新 --schedule-expression 属性的值。将 us-west-2 替换为您的 Elastic Beanstalk 环境所在的 AWS 区域。

2.要信任 CloudWatch Events 服务主体(events.amazonaws.com)并将权限范围扩展到相关规则,请运行以下命令:

aws lambda add-permission \
--function-name StartElasticBeanstalk \
--statement-id StartLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StartLambdaFunction --region us-west-2

aws lambda add-permission \
--function-name StopElasticBeanstalk \
--statement-id StopLambdaFunction \
--action 'lambda:InvokeFunction' \
--principal events.amazonaws.com \
--source-arn arn:aws:events:us-west-2:012345678912:rule/StopLambdaFunction --region us-west-2

**注意:**将 us-west-2 替换为您的 Elastic Beanstalk 环境所在的 AWS 区域。

3.要将您创建的 Lambda 函数添加到此规则中以使规则按计划运行,请运行以下 put-targets 命令:

aws events put-targets --rule StartLambdaFunction --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StartElasticBeanstalk" --region us-west-2
aws events put-targets --rule StopLambdaFunction --targets "Id"="2","Arn"="arn:aws:lambda:us-west-2:012345678912:function:StopElasticBeanstalk" --region us-west-2

**重要信息:**将每个命令中的 ARN 替换为 IAM 角色的 ARN。将 us-west-2 替换为您的 Elastic Beanstalk 环境所在的 AWS 区域。

相关信息

Elastic Beanstalk template snippets

Lambda 部署程序包

AWS 官方
AWS 官方已更新 6 个月前