Идентификатор VPC не существует в boto3

#python-2.7 #amazon-web-services #boto3

#python-2.7 #amazon-веб-сервисы #boto3

Вопрос:

У меня есть VPC, который я создал в консоли AWS. По сути, я хотел бы создать скрипт на python, который определяет VPC и несколько других аргументов CLI с помощью click. Но одна часть кода продолжает нарушаться, когда я создаю группу безопасности. Он жалуется, что идентификатор VPC не существует, когда он существует:

 @click.command()
@click.option('--ami', help='What AWS AMI are you using?')
@click.option('--instancetype', help='AWS EC2 instance type')
@click.option('--vpc', help='VPC ID')
@click.option('--isweb',default=True,type=bool,help='Is this a web server')
@click.pass_context
def build(ctx,ami,instancetype,vpc,isweb):
    """ Will build out the EC2 instance """
    log.info("Building EC2...")
    log.info("Collecting Information....")
    log.info("AMI: "   ami)
    log.info("Instance Type: "   instancetype)
    log.info("VPC ID: "   vpc)
    log.info("Is this a web server: "   str(isweb))

    if isweb:
        log.info("Spinning up Web Server")
        log.info("Reading from Configuration file")

        config = configparser.RawConfigParser()
        config_path = os.getcwd()   '/config.txt'
        config.read(config_path)
        log.info("Reading from config file"   config_path)
        details_dict = dict(config.items('builder'))

        access_key = config.get('builder','aws_access_key_id')
        secret_key = config.get('builder','aws_secret_access_key')
        region = config.get('builder', 'region')
        ec2 = boto3.resource('ec2', aws_access_key_id=access_key,  aws_secret_access_key=secret_key, region_name=region)
        if ec2:
            log.info("AWS Session Created")
            sec_group = ec2.create_security_group(
                GroupName='webserver', Description='webserver', VpcId=vpc)
            sec_group.authorize_ingress(
                CidrIp='0.0.0.0/0',
                IpProtocol='tcp',
                FromPort=80,
                ToPort=80
                )
  

Аргумент, который я передаю, — это vpc, и он явно существует в консоли. Почему он не принимает идентификатор VPC???

 ryan@T1000:~/Desktop/ec2-builder$ python ec2-build.py build --ami="ami-0de7daa7385332688" --instancetype=t2.micro --isweb=True --vpc=vpc-0f79b10c0f471033c
2019-03-02 09:46:47,248 Building EC2...
2019-03-02 09:46:47,248 Collecting Information....
2019-03-02 09:46:47,248 AMI: ami-0de7daa7385332688
2019-03-02 09:46:47,248 Instance Type: t2.micro
2019-03-02 09:46:47,248 VPC ID: vpc-0f79b10c0f471033c
2019-03-02 09:46:47,248 Is this a web server: True
2019-03-02 09:46:47,248 Spinning up Web Server
2019-03-02 09:46:47,248 Reading from Configuration file
2019-03-02 09:46:47,249 Reading from config file/home/ryan/Desktop/ec2-builder/config.txt
2019-03-02 09:46:47,407 AWS Session Created
Traceback (most recent call last):
  File "ec2-build.py", line 87, in <module>
    if __name__ == "__main__": main()
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 764, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python2.7/dist-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "ec2-build.py", line 59, in build
    GroupName='webserver', Description='webserver', VpcId=vpc)
  File "/usr/local/lib/python2.7/dist-packages/boto3/resources/factory.py", line 520, in do_action
    response = action(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/boto3/resources/action.py", line 83, in __call__
    response = getattr(parent.meta.client, operation_name)(**params)
  File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 357, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 661, in _make_api_call
    raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (InvalidVpcID.NotFound) when calling the CreateSecurityGroup operation: The vpc ID 'vpc-0f79b10c0f471033c' does not exist
  

Ответ №1:

Я считаю, что ваше решение довольно простое. Значение, хранящееся в переменных vpc, равно ‘vpc-id ….’.

Этого должно быть достаточно, чтобы удалить одинарные кавычки.

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

 ec2 = boto3.client('ec2')

ec2.create_security_group(GroupName='webserver',Description='webserver',VpcId=vpc)
  

Последнее, что нужно проверить, это регион, убедитесь, что ваш vpc находится в правильном.

Комментарии:

1. Я передаю переменную vpc методу, разве это не должно работать, поскольку оно содержит идентификатор vpc?

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

3. Я не заключаю переменную в одинарные кавычки… Я думаю, может быть, vpc приведен неправильно?

4. Я имею в виду, что если ваш vpcID определенно vpc-0f79b10c0f471033c и вы можете видеть это в консоли, то мне трудно увидеть что-то неправильное. Единственное, что нужно подтвердить, это регион. Ваш VPC определенно находится в регионе, который вы определяете в переменной region?

5. РЖУНИМО, ты гениальный чувак.. Я полагал, что по умолчанию будет использоваться us-east-1.. Вместо этого он в Огайо..