Boto3 实战:使用 AWS SDK for Python 管理 Amazon EC2 安全组(Security Group)
2026/9/24 23:05:38 网站建设 项目流程
  • 后端
  • 云原生

【免费下载链接】boto3

AWS SDK for Python (Boto3)

项目地址:https://gitcode.com/gh_mirrors/bo/boto3
点击查看免费下载

本指南基于 Boto3 官方指南 docs/source/guide/ec2-example-security-group.rst 展开,系统讲解如何用 AWS SDK for Python(Boto3)查询、创建、授权入站规则并删除 EC2 安全组。你将掌握describe_security_groupscreate_security_groupauthorize_security_group_ingressdelete_security_group四个 EC2 客户端方法的完整用法、参数语义与异常处理,并结合仓库源码理解 Boto3 客户端与资源接口的底层组织方式。

背景:EC2 安全组是什么

Amazon EC2 安全组(Security Group)本质上是一台虚拟防火墙,负责控制一个或多个实例的出入站流量。你可以为每个安全组添加规则(Rules),决定允许哪些流量进入或离开其关联的实例;规则可以随时修改,修改后的新规则会自动应用到与该安全组关联的所有实例,通常即时生效(极小概率存在短暂的传播延迟)。

在本例场景中,Python 代码通过 AWS SDK for Python 完成如下与安全组相关的 EC2 操作,涉及 EC2 客户端(Client)类的以下四个方法:

方法作用
describe_security_groups查询一个或多个安全组的详细信息
create_security_group创建一个新的安全组
authorize_security_group_ingress为安全组添加入站(Ingress)规则
delete_security_group删除一个已存在的安全组

说明:原文中该段文字存在笔误("manage IAM access keys"),实际管理对象为安全组,本文按真实语义表述。

前置条件

在运行本文所有示例前,你需要先完成两件事:

  1. 安装 Boto3:使用pip install boto3(建议在虚拟环境中安装,详见 docs/source/guide/quickstart.rst)。
  2. 配置 AWS 凭证:按 docs/source/guide/quickstart.rst 中的说明配置 AWS 凭证,通常是通过aws configure或在~/.aws/credentials中写入访问密钥,并在~/.aws/config中指定默认区域(例如region=us-east-1)。也可以直接在创建客户端时传入region_name

凭证配置完成之前,所有 API 调用都会因身份认证失败而抛出ClientError

查询安全组:describe_security_groups

安全组既可以用于 EC2-Classic 平台的实例,也可以用于特定 VPC 中的实例。调用describe_security_groups可以查询一个或多个安全组,通过GroupIds参数按安全组 ID 精确查询。

import boto3 from botocore.exceptions import ClientError ec2 = boto3.client('ec2') try: response = ec2.describe_security_groups(GroupIds=['SECURITY_GROUP_ID']) print(response) except ClientError as e: print(e)

要点说明:

  • SECURITY_GROUP_ID需要替换为形如sg-xxxxxxxx的真实安全组 ID。
  • 返回值responseSecurityGroups数组包含安全组详情,例如GroupIdGroupNameDescriptionVpcIdIpPermissions(入站规则)、IpPermissionsEgress(出站规则)等。
  • 若未指定任何筛选条件,describe_security_groups默认返回当前账号/区域内全部安全组(自动分页,可通过MaxResults/NextToken控制)。GroupIdsFilters(如{'Name': 'group-name', 'Values': [...]})可组合使用。
  • 查询不存在的安全组 ID 时,会抛出ClientError,因此必须用try/except包裹。

⚠️ EC2-Classic 已于 2022 年 8 月 15 日退役,官方强烈建议将工作负载迁移到 VPC。新建安全组时务必指定VpcId,不要再依赖 EC2-Classic 平台。

创建安全组并添加入站规则

创建安全组的完整流程分为两步:先用create_security_group创建安全组,再用authorize_security_group_ingress添加入站规则。规则变更会尽可能快地传播到组内实例,但可能仍有少量延迟。

import boto3 from botocore.exceptions import ClientError ec2 = boto3.client('ec2') response = ec2.describe_vpcs() vpc_id = response.get('Vpcs', [{}])[0].get('VpcId', '') try: response = ec2.create_security_group(GroupName='SECURITY_GROUP_NAME', Description='DESCRIPTION', VpcId=vpc_id) security_group_id = response['GroupId'] print('Security Group Created %s in vpc %s.' % (security_group_id, vpc_id)) data = ec2.authorize_security_group_ingress( GroupId=security_group_id, IpPermissions=[ {'IpProtocol': 'tcp', 'FromPort': 80, 'ToPort': 80, 'IpRanges': [{'CidrIp': '0.0.0.0/0'}]}, {'IpProtocol': 'tcp', 'FromPort': 22, 'ToPort': 22, 'IpRanges': [{'CidrIp': '0.0.0.0/0'}]} ]) print('Ingress Successfully Set %s' % data) except ClientError as e: print(e)

参数详解与实战建议

create_security_group参数:

  • GroupName:安全组名称,在 VPC 内必须唯一。
  • Description:安全组描述,必填参数,建议写明用途(例如"Web server access")。
  • VpcId:安全组所属 VPC 的 ID。示例中通过describe_vpcs自动获取第一个 VPC 的 ID;若账号下没有 VPC,response.get('Vpcs', [{}])[0].get('VpcId', '')会返回空字符串,此时创建可能失败或落入非预期平台,生产代码中建议显式指定 VPC。
  • 返回值response['GroupId']是新创建安全组的 ID,必须保存下来供后续授权规则和删除使用。

authorize_security_group_ingress参数:

  • GroupId:目标安全组 ID。
  • IpPermissions:入站规则列表,每条规则包含:
    • IpProtocol:协议,例如tcpudpicmp-1(全部协议)。
    • FromPort/ToPort:端口范围;ICMP 场景下为类型/代码。
    • IpRanges:源 CIDR 列表,{'CidrIp': '0.0.0.0/0'}表示允许所有来源 IP。
    • 还可用Ipv6RangesPrefixListIdsUserIdGroupPairs(引用其他安全组)等字段。

⚠️ 安全提醒:示例中同时开放 80(HTTP)与 22(SSH)到0.0.0.0/0,意味着任何 IP 都能 SSH 登录你的实例,仅适用于测试环境。生产环境应将CidrIp收紧为办公网段或跳板机 IP,并考虑只开放必要的端口。

关于端口复用与幂等性:AWS 安全组规则是幂等的,重复添加完全相同的规则不会报错(Duplicate场景会被服务端去重),但删除不存在的规则会失败。

删除安全组:delete_security_group

删除安全组使用delete_security_group(GroupId=...)。需要注意:如果该安全组仍与某个实例关联,或被另一个安全组引用,删除操作会失败——在 EC2-Classic 中返回InvalidGroup.InUse,在 EC2-VPC 中返回DependencyViolation。因此删除前必须确保先解除关联。

import boto3 from botocore.exceptions import ClientError # Create EC2 client ec2 = boto3.client('ec2') # Delete security group try: response = ec2.delete_security_group(GroupId='SECURITY_GROUP_ID') print('Security Group Deleted') except ClientError as e: print(e)

要点说明:

  • GroupId为必填;也可以使用GroupName(仅 EC2-Classic 支持按名称删除,VPC 场景必须使用 ID)。
  • 删除成功时返回值为空字典,打印"Security Group Deleted"即可确认。
  • 若安全组仍在被使用,ClientErrorresponse['Error']['Code']DependencyViolationInvalidGroup.InUse,可通过判断该错误码给用户更友好的提示。

结合仓库源码理解底层实现

EC2 客户端方法的来源

上述四个方法均来自 Boto3 的底层客户端(Client)API。在 boto3/init.py 中,boto3.client('ec2')经由 boto3/session.py 的Session.client()构造,底层依赖 Botocore 加载 EC2 服务的service-2.json模型(由botocore包提供),从而生成EC2客户端。这意味着方法的参数校验、请求签名、重试逻辑均由该服务模型驱动。

安全组的资源级封装

除了客户端方法,Boto3 还为 EC2 提供了资源(Resource)级接口。在 boto3/data/ec2/2016-11-15/resources-1.json 以及更早的2014-10-012015-03-012015-04-152015-10-012016-04-012016-09-15等版本的数据文件中,均定义了SecurityGroup资源类型。从源码结构可以推断,资源接口会把describe_security_groups等操作封装为高层的ec2.SecurityGroup(id)对象及其方法(如sg.create_tags(...)sg.load()等),方便以面向对象方式操作;而本文示例采用客户端风格,更贴近底层 API 语义。

测试与验证

仓库的功能测试 tests/functional/test_ec2.py 展示了如何用botocore.stub.Stubber对 EC2 客户端/资源做离线桩测试:先stubber.add_response(...)注入期望响应,再断言调用结果,这为安全组相关代码的单元测试提供了可复用的模式——即使不连真实 AWS,也能验证请求参数是否按预期发送。

完整运行流程小结

  1. 配置凭证与区域(aws configure或手工编辑~/.aws/credentials~/.aws/config)。
  2. ec2.describe_security_groups()确认现有安全组。
  3. ec2.describe_vpcs()获取 VPC ID,再ec2.create_security_group(...)创建安全组。
  4. ec2.authorize_security_group_ingress(...)添加入站规则。
  5. 不再需要时,先解除实例关联,再ec2.delete_security_group(...)删除。

每一步都应以try/except ClientError包裹并打印错误,便于定位权限、参数或依赖问题。更多 EC2 相关示例(实例管理、密钥对、区域可用区、弹性 IP)见 docs/source/guide/ec2-examples.rst。

  • 后端
  • 云原生

【免费下载链接】boto3

AWS SDK for Python (Boto3)

项目地址:https://gitcode.com/gh_mirrors/bo/boto3
点击查看免费下载
上一篇:Diablo Edit2:暗黑破坏神II终极角色编辑器完全指南
下一篇:Diablo Edit2:暗黑破坏神II角色编辑器完全指南 - 打造完美游戏体验

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询