2017-11-02 13 views
0

대기열 'myDownlinQueue'에서 미터법 (트리거)이 ApproximateNumberOfMessagesVisible 인 경보를 만들고 싶습니다. 경보는 AutoScalingGroup 자동 조정 작업을 수행합니다. 그러나 내가 작성한 코드를 기반으로 제목에 언급 된 오류가 발생합니다. 어쩌면 내가 잘못하고 있지만, 아래는이 오류를 일으키는 코드입니다.TypeError : 목록 인덱스가 str이 아닌 정수 여야합니다.

# ==== 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]) 

오류가 마지막 방법입니다 - 알람을 생성, 정확하게 scalingDownPolicy.policy_arn

+0

질문이 너무 많아 코드가 너무 많으며 전체 오류 메시지가 없습니다. 추적 코드에 줄 번호가 들어있어 코드 또는 다른 라이브러리에서 문제가 발생했는지 여부를 나타낼 수 있습니다. –

+0

@PauloScardine 제목에 오류가 있으며 마지막 줄에 주석이있는 경우 마지막 줄에 주석을 달면 오류가 발생하지 않습니다. 문제는 정확히 scalingDownPolicy.policy_arn입니다. create_alarm 메소드는 문자열 목록이 아닌 인덱스 목록을 필요로하지만 http://boto.cloudhackers.com/en/latest/autoscale_tut.html의 예제를 사용했습니다. 작업에 SQS 메트릭을 사용하는 알람을 작성하려면 어떻게해야합니까? 자동 크기 조절? –

+0

오류 메시지는 매우 명백합니다.'scalingDownPolicy.policy_arn'은 문자열이지만 함수 호출에 정수가 필요합니다. 당신의 혼란은 무엇입니까? –

답변

0

하나 영업 이익은 문서를 오해하거나 혼동.

boto2 cloudwatch.list_metric()에 따르면 항목은 list을 반환합니다.

list_metrics (next_token가 = 없음, 치수 = 없음, METRIC_NAME = 없음, 스페이스 = 없음)

가 유효한 메트릭들의리스트를 반환하는 데이터가 기록 가능한 이.

그래서 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' 
}