基本上,我試過lambda函式和s3 "所有物件洗掉事件 "觸發器,但它停止了實體,即使我從桶的指定檔案夾中洗掉了一個檔案。
import boto3
region = 'us-west-1'
實體 = ['i-12345cb6de4f78g9h']
ec2 = boto3.client('ec2', region_name=region)
def lambda_handler(event, context):
ec2.stop_instances(InstanceIds=instances)
print('stoped your instances: ' str(instances))
uj5u.com熱心網友回復:
從S3到Lambda沒有觸發器是 "空桶"。 S3觸發器是:
- 新物件創建事件 洗掉物件事件恢復物件事件減少冗余存盤。
- 復制事件 。
最接近的是s3:ObjectRemoved:Delete或s3:ObjectRemoved:DeleteMarkerCreated。 你的代碼將不得不做的作業是,當你得到Delete觸發器時,看看桶現在是否是空的。 如果桶是空的那么停止EC2.
uj5u.com熱心網友回復:
看來你已經將Amazon S3配置為對所有物件洗掉事件觸發你的AWS Lambda函式。這意味著,只要任何物件在桶中被洗掉(如果定義了特定的前綴),就會觸發Lambda函式。
由于您只希望在桶為空時停止EC2實體,您將需要在Lambda函式中添加代碼,以確定桶是否為空。如果它是空的,它就應該停止該實體。
該函式可以通過列出桶的內容來實作這一目的。如果在串列中沒有物件回傳,那么它將知道該桶是空的。
替代方法 我假設您在 EC2 實體上運行代碼,處理來自 Amazon S3 桶的物件,并在處理完后洗掉該物件。因此,在洗掉物件后,你在EC2實體上的代碼可以很容易地檢查S3桶的內容,如果沒有更多的物件,它可以停止實體本身(無需使用AWS Lambda函式)。這可以通過呼叫 或者,你可以完全改變你的架構,通過Amazon SQS佇列向EC2實體提供資訊,而不是使用Amazon S3桶中的檔案。
uj5u.com熱心網友回復: 為什么不檢查桶的內容,如果沒有物件就停止實體。可以使用下面的代碼
標籤:StopInstances()來實作,或者簡單地告訴作業系統關閉(例如sudo shutdown now -h)。這將停止該實體。(請確保你包括-h來停止機器。
匯入boto3
region = 'us-west-1'
實體 = ['i-12345cb6de4f78g9h'] 。
ec2 = boto3.client('ec2', region_name=region)
s3 = boto3.resource('s3')
def lambda_handler(event, context):
# 獲得桶和所有物件的串列
bucket = s3.Bucket('bucket_name')
count_obj = 0
for i in bucket.objects.all():
count_obj = count_obj 1
# 檢查bucket物件的長度,如果沒有物件就停止實體
如果count_obj == 0:
ec2.stop_instances(InstanceIds=instances)
print('stoped your instances: ' str(instances))
