Ошибка клиента при остановке экземпляров с помощью лямбды в переменных среды - PullRequest
0 голосов
/ 11 декабря 2018

Я получаю сообщение об ошибке клиента, чтобы остановить экземпляр, используя Lambda, предоставляя идентификатор экземпляра в переменных среды, но работает нормально, когда я жестко кодирую идентификатор экземпляра

Функция лямбда:

instances = ['i-0d66b89b8c010560d']

import boto3
import os
# Enter the region your instances are in. Include only the region without 
specifying Availability Zone; e.g., 'us-east-1'
region = 'us-east-1'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
# instances = ['i-0d66b89b8c010560d']

def lambda_handler(event, context):
    print 'stopping your instance'
    instances = os.environ['INSTANCES_ID']
    print instances
    print type(instances)
    instances = list(instances)
    print type(instances)
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

Вывод журнала:

START RequestId: 5c965493-fd10-11e8-9c0f-09f0c600ad35 Version: $LATEST
stopping your instance
i-0d66b89b8c010560d
<type 'str'>
<type 'tuple'>
An error occurred (InvalidInstanceID.Malformed) when calling the 
StopInstances operation: Invalid id: "i": ClientError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 18, in lambda_handler
ec2.stop_instances(InstanceIds=instances)
File "/var/runtime/botocore/client.py", line 314, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/var/runtime/botocore/client.py", line 612, in _make_api_call
raise error_class(parsed_response, operation_name)
ClientError: An error occurred (InvalidInstanceID.Malformed) when calling  
the StopInstances operation: Invalid id: "i"

1 Ответ

0 голосов
/ 11 декабря 2018

Как вы можете видеть в выходных данных журнала, ваши «экземпляры» - это str со значением i-0d66b89b8c010560d.Что вы, вероятно, не знаете, так это то, что str является итеративным.Заставить список вызывать себя не так, как вы ожидаете.Поэтому, когда вы вызываете этот код:

instances = list(instances)

Вы на самом деле делаете это:

>>> instances = 'i-0d66b89b8c010560d'
>>> list(instances)
['i', '-', '0', 'd', '6', '6', 'b', '8', '9', 'b', '8', 'c', '0', '1', '0', '5', '6', '0', 'd']

Видите, что происходит?Ваша строка преобразуется в список, где каждый индекс строки является индексом в списке.

Таким образом, решение будет таким:

instances = ['i-0d66b89b8c010560d']

import boto3
import os
# Enter the region your instances are in. Include only the region without 
specifying Availability Zone; e.g., 'us-east-1'
region = 'us-east-1'
# Enter your instances here: ex. ['X-XXXXXXXX', 'X-XXXXXXXX']
# instances = ['i-0d66b89b8c010560d']

def lambda_handler(event, context):
    print 'stopping your instance'
    instances = os.environ['INSTANCES_ID']
    print instances
    print type(instances)
    instances = [instances]
    print type(instances)
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...