[英]AWS EC2 log userdata output to cloudwatch logs
我正在使用 EC2 执行预处理任务。
我使用 userdata 变量执行 shell 命令。 我的用户数据的最后一行有sudo shutdown now -h
。 因此,一旦预处理任务完成,实例就会自动终止。
这就是我的代码的样子。
import boto3
userdata = '''#!/bin/bash
pip3 install boto3 pandas scikit-learn
aws s3 cp s3://.../main.py .
python3 main.py
sudo shutdown now -h
'''
def launch_ec2():
ec2 = boto3.resource('ec2',
aws_access_key_id="",
aws_secret_access_key="",
region_name='us-east-1')
instances = ec2.create_instances(
ImageId='ami-0c02fb55956c7d316',
MinCount=1,
MaxCount=1,
KeyName='',
InstanceInitiatedShutdownBehavior='terminate',
IamInstanceProfile={'Name': 'S3fullaccess'},
InstanceType='m6i.4xlarge',
UserData=userdata,
InstanceMarketOptions={
'MarketType': 'spot',
'SpotOptions': {
'SpotInstanceType': 'one-time',
}
}
)
print(instances)
launch_ec2()
问题是,有时当我的 python 脚本出现错误时,脚本会终止并且实例会终止。
有没有办法在实例终止之前收集错误/信息日志并将其发送到 cloudwatch? 这样,我就知道出了什么问题。
您可以通过利用bash功能来实现所需的行为。 实际上,您可以为 UserData 的整个执行创建一个日志文件,并且您可以使用trap
确保在发生错误时终止之前将日志文件复制到 S3。
这是它的外观:
#!/bin/bash -xe
exec &>> /tmp/userdata_execution.log
upload_log() {
aws s3 cp /tmp/userdata_execution.log s3://... # use a bucket of your choosing here
}
trap 'upload_log' ERR
pip3 install boto3 pandas scikit-learn
aws s3 cp s3://.../main.py .
python3 main.py
sudo shutdown now -h
将为 UserData 生成一个包含 stdout 和 stderr 的日志文件(/tmp/userdata_execution.log
); 如果在 UserData 执行过程中出现错误,日志文件将被上传到 S3 存储桶。
如果您愿意,您当然也可以将日志文件流式传输到 CloudWatch,但要这样做,您必须在实例上安装 CloudWatch 代理并进行相应配置。 我相信对于您的用例,将日志文件上传到 S3 是最好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.