【问题标题】:unable to check and create aws security group with boto3无法使用 boto3 检查和创建 aws 安全组
【发布时间】:2019-01-18 23:31:52
【问题描述】:

我正在尝试创建一个安全组并使用 boto3 获取安全组 ID 作为输出。我想要这样的东西:

  1. 如果安全组存在,则获取/返回/输出 groud id。

  2. 如果安全组不存在,则使用给定规则创建和授权组并输出组 id

这是我目前的代码:

ec2 = boto3.client('ec2', region_name='us-east-1')
for rds_security_group in ec2.describe_security_groups()['SecurityGroups']:
    if rds_security_group['GroupName'] == 'testgroup':
         print(rds_security_group['GroupId'])
         return (rds_security_group['GroupId'])
     else:
          rds_security_group_name = ec2.create_security_group(
                GroupName='testgroup',
                Description='rds-security-group',
                VpcId='vpc-12345')
          client.authorize_security_group_ingress(
                CidrIp=10.10.10.10/11,
                IpProtocol='tcp',
                FromPort=90,
                ToPort=90,
                GroupId=rds_security_group_name['GroupId'])
          print(rds_security_group_name['GroupId'])
          return(rds_security_group_name['GroupId'])

如果安全组不存在,代码通过创建组并返回组 ID 可以完美运行。但如果安全组已存在并抛出现有错误,则无法返回组 ID。

botocore.exceptions.ClientError: An error occurred (InvalidGroup.Duplicate) when calling the CreateSecurityGroup operation: The security group 'testgroup' already exists for VPC 'vpc-12345'

请帮我解决这个问题?

【问题讨论】:

    标签: python amazon-web-services boto3 amazon-vpc aws-security-group


    【解决方案1】:

    您的问题是您正在遍历每个安全组并检查其组名。如果第一个安全组不称为“testgroup”,那么您尝试创建它。将您的代码更改为以下内容:

    ec2 = boto3.client('ec2', region_name='us-east-1')
    for rds_security_group in ec2.describe_security_groups()['SecurityGroups']:
        if rds_security_group['GroupName'] == 'testgroup':
             print(rds_security_group['GroupId'])
             return (rds_security_group['GroupId'])
    
    # Security Group was not found, create it
    rds_security_group_name = ec2.create_security_group(
          GroupName='testgroup',
          Description='rds-security-group',
          VpcId='vpc-12345')
    client.authorize_security_group_ingress(
          CidrIp=10.10.10.10/11,
          IpProtocol='tcp',
          FromPort=90,
          ToPort=90,
          GroupId=rds_security_group_name['GroupId'])
    print(rds_security_group_name['GroupId'])
    return(rds_security_group_name['GroupId'])
    

    【讨论】:

    • 感谢您的评论。但我确实在上面的代码中通过简单的更改自己找到了答案。
    • 发布您的解决方案。
    • 我一定会尝试一下您的解决方案,如果进展顺利,我会投赞成票
    【解决方案2】:
    ec2 = boto3.client('ec2', region_name='us-east-1')
    for rds_security_group in ec2.describe_security_groups()['SecurityGroups']:
        if rds_security_group['GroupName'] == 'testgroup':
             print(rds_security_group['GroupId'])
             return (rds_security_group['GroupId'])
    else:
         rds_security_group_name = ec2.create_security_group(
              GroupName='testgroup',
              Description='rds-security-group',
              VpcId='vpc-12345')
         client.authorize_security_group_ingress(
               CidrIp=10.10.10.10/11,
               IpProtocol='tcp',
               FromPort=90,
               ToPort=90,
               GroupId=rds_security_group_name['GroupId'])
         print(rds_security_group_name['GroupId'])
         return(rds_security_group_name['GroupId'])
    

    我确实找到了我的问题的答案,只是对现有代码本身进行了轻微更改

    【讨论】:

    • 除了看起来不正确的格式还有什么变化?
    • @MichaelR else 不与if 配对,而是与for 配对,即。 e.如果for 循环中没有发生break,则执行“其他命令”。如果break 不是代码的一部分,则应避免使用“for-else”。如果循环中的if 条件触发,则该方法返回(或失败)并且无法达到“for-else 命令”。应该首选 John Hanley 的解决方案。
    猜你喜欢
    • 2017-03-08
    • 2019-08-20
    • 2016-04-11
    • 2019-12-24
    • 2017-11-26
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多