【问题标题】:modify_instance_attribute() only accepts keyword argumentsmodify_instance_attribute() 只接受关键字参数
【发布时间】:2018-11-22 19:48:04
【问题描述】:

我有以下任务:

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" )

然后得到:

关键字 arg 之后的非关键字 arg(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 amazon-ec2 aws-lambda boto3


    【解决方案1】:

    根据boto3modify_instance_attributedocumentation,试试这个(未测试代码):

    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'>"
    • 您正在尝试将列表作为参数传递,并且该函数需要一个字符串。仅使用一个实例 ID,而不是整个列表。在您的情况下,可能是instance['InstanceId']
    猜你喜欢
    • 2021-09-24
    • 2021-10-10
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2016-09-01
    • 2012-07-27
    相关资源
    最近更新 更多