Следующий код запускает экземпляры в соответствии с заданным требованием, например 3, но он создает теги, добавляет целевую группу loadbalancer только к одному экземпляру, также возвращает только один идентификатор экземпляра и пропускает оставшиеся два экземпляра.

Я не понимаю почему, вы можете мне помочь?

import boto3
import json
import botocore
import os
import sys
from collections import defaultdict

AMI = 'ami-047a51fa27710816e'
INSTANCE_TYPE = 't2.micro'
KEY_NAME = 'mikey'
REGION = 'us-east-1'


client = boto3.client('ec2', region_name=REGION)
client= boto3.client('ec2')

def lambda_handler(event, context):

    instance = client.run_instances(
        ImageId=AMI,
        InstanceType=INSTANCE_TYPE,
        KeyName=KEY_NAME,
        MaxCount=3,
        MinCount=3
    )
    
    print ("New instance created:", instance)
    instance_id = instance['Instances'][0]['InstanceId']
    waiter = client.get_waiter('instance_running')
    waiter.wait(InstanceIds=[instance_id],
    WaiterConfig={
        'Delay': 15
    })
    print (instance_id)
    
    response_tags = client.create_tags(
    Resources=[
        instance_id,
    ],
    Tags=[
        {
            'Key': 'Name',
            'Value': 'test'
        },
    ]
    )
    print ("Tags added")
    clients=boto3.client('elbv2')

    response_tg = clients.register_targets(
        TargetGroupArn='arn:aws:elasticloadbalancing:us-east-1:123456789123:targetgroup/target-demo/c64e6bfc00b4658f',
        Targets=[
           {
            'Id': instance_id
           },
        ]
   )
    return ('Instance created', instance_id)
0
Naeem 2 Мар 2021 в 10:49

1 ответ

Лучший ответ

Вызов run_instances фактически вернет все идентификаторы экземпляров, вы просто обрабатываете только один из них.

Здесь вы явно извлекаете только один идентификатор экземпляра.

instance_id = instance['Instances'][0]['InstanceId']

Что вам нужно сделать, так это обработать их все примерно так:

instance = client.run_instances() # Your full call here
instance_ids = [item['InstanceId'] for item in instance['Instances']]

waiter = client.get_waiter('instance_running')
waiter.wait(InstanceIds=instance_ids)

#... now all your instances are running
response_tags = client.create_tags(
    Resources=instance_ids,
    Tags=[{"Key": "Name", "Value": "Test"}]
)

elb_client = boto3.client("elbv2")

response_tg = elb_client.register_targets(
    TargetGroupArn="arn...",
    Targets=[{"Id": instance_id} for instance_id in instance_ids]
)

Переменная instance_ids теперь представляет собой список с тремя идентификаторами экземпляров, и вам также необходимо обновить вызовы register_targets и create_tags, чтобы отразить это.

0
Maurice 2 Мар 2021 в 09:10