AWS Lambda / Python 2.7 / boto3

Я пытаюсь отменить одно правило из многих в группе безопасности (SG_we_are_working_with), но получаю ошибку

Произошла ошибка (InvalidGroup.NotFound) при вызове операции RevokeSecurityGroupIngress: группа безопасности 'sg-xxxxx' не существует в VPC по умолчанию 'none'

SG на самом деле не в VPC по умолчанию, а в пользовательском, но я явно упоминаю идентификатор VPC!

SG_we_are_working_with = 'sg-xxxxx'
SG_which_is_the_source_of_the_traffic = 'sg-11111111'
VpcId = 'vpc-2222222'

#first I load the group to find the necessary rule
ec2 = boto3.resource('ec2')
security_group = ec2.SecurityGroup(SG_we_are_working_with)
security_group.load()   # get current data

# here is loop over rules
for item in security_group.ip_permissions:

Здесь мы берем необходимый предмет, он имеет что-то вроде:

{ 
"PrefixListIds": [], 
"FromPort": 6379, 
"IpRanges": [], 
"ToPort": 11211, 
"IpProtocol": "tcp", 
"UserIdGroupPairs": [ { 
    "UserId": "00111111111", 
    "Description": "my descr", 
    "GroupId": "sg-11111111" 
} ], 
"Ipv6Ranges": [] 
}

Тогда:

# now attempt to delete, the necessary data is in 'item' variable:
IpPermissions=[
    {
        'FromPort': item['FromPort'],
        'ToPort': item['ToPort'],
        'IpProtocol': 'tcp',
        'UserIdGroupPairs': [
            {
                'Description': item['UserIdGroupPairs'][0]["Description"],
                'GroupId': item['UserIdGroupPairs'][0]["GroupId"],
                'UserId': item['UserIdGroupPairs'][0]["UserId"],
                'VpcId': str(VpcId)
            },
        ]
    }
]
security_group.revoke_ingress(
    FromPort =  item['FromPort'],
    GroupName = SG_we_are_working_with,
    IpPermissions = IpPermissions,
    IpProtocol = 'tcp',
    SourceSecurityGroupName = SG_which_is_the_source_of_the_traffic,
    ToPort = item['ToPort']
)

Я использую документ здесь

Что я делаю не так?

Спасибо.

0
Putnik 13 Сен 2018 в 17:58

2 ответа

Лучший ответ

Весь приведенный выше код является правильным, кроме последней части, понятия не имею, почему это не объясняется в документе.

Решение, используя код из вопроса:

security_group.revoke_ingress(
    IpPermissions = IpPermissions,
)

Итак, все эти вещи

FromPort =  item['FromPort'],
GroupName = SG_we_are_working_with,
IpProtocol = 'tcp',
SourceSecurityGroupName = SG_which_is_the_source_of_the_traffic,
ToPort = item['ToPort']

Был чрезмерным и вызвал ошибку.

0
Putnik 27 Сен 2018 в 16:34

Я обнаружил, что самый простой способ отозвать разрешения - это передать разрешения уже в группе безопасности:

import boto3

# Connect to the Amazon EC2 service
ec2 = boto3.resource('ec2')

# Retrieve the security group
security_groups = ec2.security_groups.filter(GroupNames=['MY-GROUP-NAME'])

# Delete all rules in the group
for group in security_groups:
    group.revoke_ingress(IpPermissions = group.ip_permissions)
0
John Rotenstein 14 Сен 2018 в 01:07