【问题标题】:TypeError : list indices must be integers not strTypeError : 列表索引必须是整数而不是 str
【发布时间】:2017-11-14 00:36:44
【问题描述】:

我想在队列“myDownlinQueue”中创建一个指标(触发器)为 ApproximateNumberOfMessagesVisible 的警报,该警报采取自动缩放 AutoScalingGroup 的操作。但是,根据我正在编写的代码,我得到了标题中提到的错误。也许我做错了,但下面是导致此错误的代码。

# ==== AutoSCaling config =======================
autoscaling_group = {
"name": "myAG", #descriptive name for your auto scaling group
"min_size": 0 , #Minimum number of instances that should be running at all times
"max_size": 0   #Maximum number of instances that should be running at all times
}


lc_name = 'myLG' #Descriptive name for your launch configuration

#=================AMI to launch======================================================
as_ami = {
"id": "ami-******c", #The AMI ID of the instance your Auto Scaling group will launch
"VpcId" : "vpc-0c805575",
"security_groups": "sg-xxxxxxxa", #The security group(s) your instances will belong to
"instance_type": "t2.micro", #The size of instance that will be launched
"instance_monitoring": True #Indicated whether the instances will be launched with detailed monitoring enabled. Needed to enable CloudWatch
}


conn_reg = boto.ec2.connect_to_region(region_name=awsRegion)
zones = conn_reg.get_all_zones()

zoneStrings = []
for zone in zones:
    zoneStrings.append(zone.name)
    print " Available zones : " + zone.name

conn_vpc = boto.connect_vpc()
subnetids = conn_vpc.get_all_subnets()


conn_as = AutoScaleConnection(AWS_ACCESS_KEY,AWS_SECRET_KEY)

lc = LaunchConfiguration(name = lc_name, 
                         image_id = as_ami["id"],
                         instance_type = as_ami["instance_type"],
                         user_data = "user-data.bls",
                         associate_public_ip_address = True,
                         instance_monitoring=as_ami["instance_monitoring"])

conn_as.create_launch_configuration(lc)

ag = AutoScalingGroup(group_name = autoscaling_group["name"], 
                      availability_zones= zoneStrings,
                      vpc_zone_identifier = subnetList,
                      launch_config=lc, min_size = autoscaling_group["min_size"], 
                      max_size = autoscaling_group["max_size"])
conn_as.create_auto_scaling_group(ag)


#=================Create Scaling Policies===================================
# Policy for scaling the number of servers up and down

scalingUpPolicy = ScalingPolicy(name = "myScaleUpPolicy",
                                          adjustment_type ="ChangeInCapacity",
                                          as_name=ag.name,
                                          scaling_adjustment = numInstances ,
                                          cooldown=180)

scalingDownPolicy = ScalingPolicy(name = "myScaleDownPolicy",
                                           adjustment_type= "ExactCapacity",
                                           as_name=ag.name,
                                           scaling_adjustment= 0 ,
                                           cooldown=180)

conn_as.create_scaling_policy(scalingUpPolicy)
conn_as.create_scaling_policy(scalingDownPolicy)


scalingUpPolicy = conn_as.get_all_policies(as_group="myAG", policy_names=["myScaleUpPolicy"])[0]
scalingDownPolicy = conn_as.get_all_policies(as_group="myAG",policy_names=["myScaleDownPolicy"])[0]


# =========== CloudWatch Connection =============
cw = connect_to_region(awsRegion)    

# ===========  SNS Connection ===================
sns = connect_to_region(awsRegion)

cw = CloudWatchConnection(AWS_ACCESS_KEY,AWS_SECRET_KEY)
sqs = SQSConnection(AWS_ACCESS_KEY,AWS_SECRET_KEY)



# ==== Alarm =================
numberOfMessages = 1
metric_object = cw.list_metrics(dimensions={"QueueName":"myDownlinkQueue"}, metric_name = "ApproximateNumberOfMessagesVisible",namespace = "AWS/SQS")

alarm_name = "myAlarm"

metric_object["ApproximateNumberOfMessagesVisible"].create_alarm(name =alarm_name, 
                                             comparison=">=", 
                                             threshold = numberOfMessages, 
                                             period = 60, 
                                             evaluation_periods = 1, 
                                             statistic = "Average", 
                                             alarm_actions=[scalingDownPolicy.policy_arn])

错误在最后一个方法——创建警报,精确缩放DownPolicy.policy_arn

【问题讨论】:

  • 问题包含太多的代码行并且缺少完整的错误消息(回溯包含行号,可以指示问题是否发生在您的代码或其他库中)。
  • @PauloScardine 错误在标题中,它发生在最后一行,如果我评论最后一行,我不会收到错误。问题正是scalingDownPolicy.policy_arn。 create_alarm 方法需要一个索引列表而不是字符串,但我使用的是来自 boto.cloudhackers.com/en/latest/autoscale_tut.html 的示例,如何创建使用 SQS 指标和自动缩放操作的警报?
  • 错误信息非常明确:scalingDownPolicy.policy_arn 是一个字符串,但函数调用需要一个整数。你有什么困惑?
  • @MarkRansom 遵循文档中的示例给出了此错误。如何获得 policy_arn 的索引?
  • 字符串的值是多少? scalingDownPolicy.policy_arn.isdigit() 是否返回 True?如果是这样,您可以将其传递为int(scalingDownPolicy.policy_arn)。如果您希望有人为您调试代码,回溯仍然很有用,因为我们可以查看发生问题的模块的源代码。

标签: python amazon-web-services amazon-ec2 boto


【解决方案1】:

OP 要么误读了文档,要么混淆了。

根据boto2 cloudwatch.list_metric(),该项目将返回一个list

list_metrics(next_token=None, dimensions=None, metric_name=None, 命名空间=无)

返回记录数据的有效指标列表 可用。

所以metric_object["ApproximateNumberOfMessagesVisible"]会踢出错误TypeError : list indices must be integers not str

OTH,boto3 cloudwatch.list_object 返回一个字典。而且它们不兼容。但是,没有一个字典键具有 ApproximateNumberOfMessagesVisible。

{
    'Metrics': [
        {
            'Namespace': 'string',
            'MetricName': 'string',
            'Dimensions': [
                {
                    'Name': 'string',
                    'Value': 'string'
                },
            ]
        },
    ],
    'NextToken': 'string'
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多