You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制AWS EC2实例仅访问同区域内的S3存储桶

解决EC2仅访问同区域S3桶的IAM策略问题

我看到你遇到的问题了——原来的IAM策略有两个关键问题导致所有S3访问被拒绝:

  1. 资源覆盖不全:S3的资源分为桶级(arn:aws:s3:::*)和对象级(arn:aws:s3:::*/*),你原来的策略只包含了桶级资源,当EC2尝试下载对象(比如s3:GetObject)时,因为资源不匹配直接被拒绝。
  2. 条件匹配方式: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
    

测试验证:

  1. 在sa-east-1启动实例后,尝试访问一个同区域的S3桶(比如执行aws s3 cp s3://your-sa-east-1-bucket/file.txt .),应该成功。
  2. 尝试访问其他区域的桶(比如aws s3 cp s3://your-us-east-1-bucket/file.txt .),会收到IAM权限拒绝的错误,符合预期。

内容的提问来源于stack exchange,提问作者Sean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 16:57:31