Modify_instance_attribute () принимает только аргументы ключевого слова

У меня следующая задача:

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)))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 146
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно boto3 modify_instance_attributeдокументация, попробуйте это (не проверенный код):

ec.modify_instance_attribute(
    InstanceIds=instance_id, 
    DisableApiTermination = {'Value': True})
"errorMessage": "Parameter validation failed:\nInvalid type for parameter InstanceId, value: ['i-07d2c5b7056bc639d'], type: <type 'list'>, valid types: <type 'basestring'>"
Milister 13.06.2018 14:44

Вы пытаетесь передать список в качестве аргумента, а функция ожидает строку. Используйте только один идентификатор экземпляра, а не весь список. В вашем случае это может быть instance['InstanceId']

FelixEnescu 13.06.2018 14:48

Другие вопросы по теме