如何限制AWS EC2实例仅访问同区域内的S3存储桶
解决EC2仅访问同区域S3桶的IAM策略问题
我看到你遇到的问题了——原来的IAM策略有两个关键问题导致所有S3访问被拒绝:
- 资源覆盖不全:S3的资源分为桶级(
arn:aws:s3:::*)和对象级(arn:aws:s3:::*/*),你原来的策略只包含了桶级资源,当EC2尝试下载对象(比如s3:GetObject)时,因为资源不匹配直接被拒绝。 - 条件匹配方式:
s3:LocationConstraint是精确的区域代码,用StringEquals比StringLike更合适,避免不必要的匹配问题。
下面是针对你的场景的完整可用CloudFormation配置,确保EC2实例(位于sa-east-1)只能访问同区域的S3桶,彻底避免跨区域数据传输费用:
InstanceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: ec2.amazonaws.com Version: "2012-10-17" Policies: - PolicyDocument: Statement: # 允许所有S3操作,但限制到sa-east-1区域的桶和对象 - Action: s3:* Effect: Allow Resource: - arn:aws:s3:::* # 覆盖桶级操作(如ListBucket、GetBucketLocation) - arn:aws:s3:::*/* # 覆盖对象级操作(如GetObject、PutObject) Condition: StringEquals: s3:LocationConstraint: sa-east-1 # 可选:如果需要列出所有账户内的桶(仅查看,无法访问其他区域桶) - Action: s3:ListAllMyBuckets Effect: Allow Resource: arn:aws:s3::: Version: "2012-10-17" PolicyName: RestrictS3ToSaEast1Region InstanceInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Roles: - Ref: InstanceRole Instance: Type: AWS::EC2::Instance Properties: IamInstanceProfile: Ref: InstanceInstanceProfile # 替换为sa-east-1区域的合法AMI和实例类型 ImageId: ami-0f9fc25dd2506cf6d # 示例sa-east-1的Amazon Linux 2 AMI,可根据实际替换 InstanceType: t3.medium AvailabilityZone: sa-east-1a DependsOn: - InstanceRole
关键细节解释:
- 资源覆盖:同时包含桶和对象资源,确保所有S3操作(不管是桶管理还是对象读写)都能匹配到策略。
- 条件约束:
s3:LocationConstraint会检查桶的实际区域——对于桶级操作,它验证桶所在区域;对于对象操作,它验证对象所属桶的区域,完美符合你的需求。 - 区域端点配置:建议在EC2实例内的S3客户端(如AWS CLI、SDK)明确指定sa-east-1区域,避免使用全局端点导致的重定向问题。比如在CLI中执行:
aws configure set region sa-east-1
测试验证:
- 在sa-east-1启动实例后,尝试访问一个同区域的S3桶(比如执行
aws s3 cp s3://your-sa-east-1-bucket/file.txt .),应该成功。 - 尝试访问其他区域的桶(比如
aws s3 cp s3://your-us-east-1-bucket/file.txt .),会收到IAM权限拒绝的错误,符合预期。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

