2017-11-02 9 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

どちらのOPは、ドキュメントを読み違えたり混乱させる。

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' 
} 
関連する問題