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?这样我就知道哪里出了问题。

您可以利用 功能实现所需的行为。 实际上,您可以为 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 是最好的解决方案。