我正在使用 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?這樣,我就知道出了什么問題。
uj5u.com熱心網友回復:
您可以通過利用重擊功能。實際上,您可以為 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 存盤桶。
如果您愿意,當然也可以將日志檔案流式傳輸到 CloudWatch,但要這樣做,您必須在實體上安裝 CloudWatch 代理并進行相應配置。我相信對于您的用例,將日志檔案上傳到 S3 是最好的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/479617.html
