代码之家  ›  专栏  ›  技术社区  ›  John

AWS EC2日志用户数据输出到cloudwatch日志

  •  1
  • John  · 技术社区  · 2 年前

    我正在使用EC2执行预处理任务。

    我使用userdata变量执行shell命令。我的userdata的最后一行 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?这样,我就知道出了什么问题。

    1 回复  |  直到 2 年前
        1
  •  2
  •   Paolo Enigma    2 年前

    您可以通过利用 功能。 实际上,您可以为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
    

    日志文件 (/tmp/userdata_execution.log )将为UserData生成包含stdout和stderr的;如果在执行UserData期间出错,日志文件将上载到S3 bucket。

    如果您愿意,当然也可以将日志文件流式传输到CloudWatch,但是要这样做,您必须在实例上安装CloudWatch代理并进行相应的配置。我相信,对于您的用例,将日志文件上载到S3是最好的解决方案。