我知道这个问题以前也有人问过,但是在过去的十年里,答案已经改变了很多次,对于这个问题的不太具体的版本,有很多方法。我在Elastic Beanstalk上部署了一个Python应用程序(Python 3.8运行在64位Amazon Linux 2/3.4.1上)。我需要每天至少拉一次数据,我有一个函数可以拉数据,我可以用python或者shell脚本调用它。我该如何设置?
kqqjbcuj1#
你必须把.ebextensions一个文件如下:cron.config
packages: yum: jq: [] files: "/usr/local/bin/test_cron.sh": mode: "000755" owner: root group: root content: | #!/bin/bash INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id 2>/dev/null` REGION=`curl -s http://169.254.169.254/latest/dynamic/instance-identity/document 2>/dev/null | jq -r .region` # Find the Auto Scaling Group name from the Elastic Beanstalk environment ASG=`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" \ --region $REGION --output json | jq -r '.[][] | select(.Key=="aws:autoscaling:groupName") | .Value'` # Find the first instance in the Auto Scaling Group FIRST=`aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names $ASG \ --region $REGION --output json | \ jq -r '.AutoScalingGroups[].Instances[] | select(.LifecycleState=="InService") | .InstanceId' | sort | head -1` # If the instance ids are the same exit 0 [ "$FIRST" = "$INSTANCE_ID" ] "/usr/local/bin/my_cron.sh": mode: "000755" owner: root group: root content: | #!/bin/bash /usr/local/bin/test_cron.sh || exit # Now run commands that should run on only 1 instance. cd /var/app/current sudo -u ec2-user your_funtion "/etc/cron.d/my_cron": mode: "000644" owner: root group: root content: | 15 7 * * * root /usr/local/bin/my_cron.sh commands: rm_old_cron: command: "rm -fr /etc/cron.d/my_cron.bak" ignoreErrors: true
在上面的代码中:
sudo -u ec2-user your_funtion
您应该在此处输入要运行的函数的路径,并且:
15 7 * * * root /usr/local/bin/my_cron.sh
在我的示例中,cron任务在每天上午7:15执行,因此您应该使用linux cron命令语法设置时间。test_cron. sh例程用于确定是否有多个EC2示例正在运行,在这种情况下,避免在多个示例中执行cron作业。(此部分摘自AWS文档)。要执行test_cron.sh例程,EC2示例应具有权限集,这是通过将以下策略添加到IAM中的aws-elasticbeanstalk-ec2-role角色来完成的(您在环境启动期间已由EB创建了此角色):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1409855610000", "Effect": "Allow", "Action": [ "autoscaling:DescribeAutoScalingGroups" ], "Resource": [ "*" ] }, { "Sid": "Stmt1409855649000", "Effect": "Allow", "Action": [ "ec2:DescribeTags" ], "Resource": [ "*" ] } ] }
1条答案
按热度按时间kqqjbcuj1#
你必须把.ebextensions一个文件如下:
cron.config
在上面的代码中:
您应该在此处输入要运行的函数的路径,并且:
在我的示例中,cron任务在每天上午7:15执行,因此您应该使用linux cron命令语法设置时间。
test_cron. sh例程用于确定是否有多个EC2示例正在运行,在这种情况下,避免在多个示例中执行cron作业。(此部分摘自AWS文档)。
要执行test_cron.sh例程,EC2示例应具有权限集,这是通过将以下策略添加到IAM中的aws-elasticbeanstalk-ec2-role角色来完成的(您在环境启动期间已由EB创建了此角色):