У меня следующая задача:
1. Проверьте, есть ли у экземпляра тег "Terminate_On".
Если да:
2.Проверьте, нужно ли завершить работу экземпляра сегодня
Если да:
3. снимите защиту завершения экземпляра, если она включена Завершить экземпляр
Я застрял на части 3: не знаю, как снять защиту, если она включена
response=ec.modify_instance_attribute(instance_ids,"disableApiTermination", "true" )
File "/var/runtime/botocore/client.py", line 312, in _api_call
"%s() only accepts keyword arguments." % py_operation_name)
TypeError: modify_instance_attribute() only accepts keyword arguments.
Если я изменю как этот:
ec.modify_instance_attribute(InstanceIds=instance_ids,"disableApiTermination", "true" )
Затем получаем:
аргумент без ключевого слова после аргумента ключевого слова (lambda_function.py, строка 34)
import boto3
import collections
import datetime
import time
import sys
ec = boto3.client('ec2', 'eu-west-1')
ec2 = boto3.resource('ec2', 'eu-west-1')
from datetime import datetime
from dateutil.relativedelta import relativedelta
date_after_month = datetime.now()+ relativedelta(days=7)
#print date_after_month.strftime('%d/%m/%Y')
today=datetime.now().strftime('%d/%m/%Y')
def lambda_handler(event, context):
instance_ids = []
reservations = ec.describe_instances(
Filters=[
{'Name': 'tag:Owner', 'Values': ['Unknown', 'unknown']},
]
).get('Reservations', [])
for reservation in reservations:
instances = reservation['Instances']
for instance in instances:
instance_ids.append(instance['InstanceId'])
tags = {}
for tag in instance['Tags']:
tags[tag['Key']] = tag['Value']
if 'TerminateOn' in tags:
if tags["TerminateOn"]==today:
#remove termination protection if enabled
ec.modify_instance_attribute(instance_ids,"disableApiTermination", "true" )
#terminate instance
ec.terminate_instances(InstanceIds=instance_ids)
else:
print "No need for termination"
if not 'TerminateOn' in tags:
ec2.create_tags(Resources=instance_ids,Tags=[{'Key':'TerminateOn','Value':date_after_month.strftime('%d/%m/%Y')}])
print("Stopping instances: {}".format(','.join(instance_ids)))






Согласно boto3 modify_instance_attributeдокументация, попробуйте это (не проверенный код):
ec.modify_instance_attribute(
InstanceIds=instance_id,
DisableApiTermination = {'Value': True})
Вы пытаетесь передать список в качестве аргумента, а функция ожидает строку. Используйте только один идентификатор экземпляра, а не весь список. В вашем случае это может быть instance['InstanceId']
"errorMessage": "Parameter validation failed:\nInvalid type for parameter InstanceId, value: ['i-07d2c5b7056bc639d'], type: <type 'list'>, valid types: <type 'basestring'>"