AWS EC2 将用户数据输出到 cloudwatch 日志
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 脚本出现错误时,脚本终止并且实例被终止。
有什么方法可以收集 error/info 日志并在实例终止之前将其发送到 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 是最好的解决方案。
我正在使用 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 脚本出现错误时,脚本终止并且实例被终止。
有什么方法可以收集 error/info 日志并在实例终止之前将其发送到 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 是最好的解决方案。