如何在预定时间停止和重启我的测试或不重要的 AWS Elastic Beanstalk 环境?
我想在预定的时间终止并重建我的测试或不重要的 AWS Elastic Beanstalk 环境。
简述
您可以使用 API 调用 terminate-environment 和 rebuild-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.zip 或 StopElasticBeanstalk.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 区域。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 9 个月前
- AWS 官方已更新 7 个月前