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

基于AWS SCP的全账号强制标签实施问题咨询

AWS 全账号资源标签强制创建方案答疑

背景说明

我需要在AWS所有账号中强制给所有资源添加指定标签,以优化成本管理和资源组织,但控制台创建的资源默认无标签容易遗漏,目标是阻止未包含指定标签的资源创建。之前已尝试三种方案:

  • AWS Organizations标签策略:仅能标记不合规资源,无法阻止创建
  • Service Control Policies (SCPs):已配置测试,但不确定覆盖范围和有效性
  • AWS Config规则:资源创建后检测不合规,属于被动修复

当前使用的SCP配置如下:

{ 
  "Version": "2012-10-17", 
  "Statement": [ 
    { 
      "Sid": "DenyResourceCreationWithoutAllTags", 
      "Effect": "Deny", 
      "Action": [ 
        "ec2:RunInstances", 
        "rds:CreateDBInstance", 
        "eks:CreateCluster", 
        "lambda:CreateFunction", 
        "dynamodb:CreateTable", 
        "cloudformation:CreateStack", 
        "elasticbeanstalk:CreateEnvironment", 
        "elasticbeanstalk:CreateApplication" 
      ], 
      "Resource": "*", 
      "Condition": { 
        "Null": { 
          "aws:RequestTag/Account": "true", 
          "aws:RequestTag/Division": "true", 
          "aws:RequestTag/Environment": "true" 
        } 
      } 
    }, 
    { 
      "Sid": "DenyResourceCreationWithEmptyTagValues", 
      "Effect": "Deny", 
      "Action": [ 
        "ec2:RunInstances", 
        "rds:CreateDBInstance", 
        "eks:CreateCluster", 
        "lambda:CreateFunction", 
        "dynamodb:CreateTable", 
        "cloudformation:CreateStack", 
        "elasticbeanstalk:CreateEnvironment", 
        "elasticbeanstalk:CreateApplication", 
        "s3:CreateBucket" 
      ], 
      "Resource": "*", 
      "Condition": { 
        "StringEquals": { 
          "aws:RequestTag/Account": "", 
          "aws:RequestTag/Division": "", 
          "aws:RequestTag/Environment": "" 
        } 
      } 
    }, 
    { 
      "Sid": "EnforceSpecificTagValues", 
      "Effect": "Deny", 
      "Action": [ 
        "ec2:RunInstances", 
        "rds:CreateDBInstance", 
        "eks:CreateCluster", 
        "lambda:CreateFunction", 
        "dynamodb:CreateTable", 
        "cloudformation:CreateStack", 
        "elasticbeanstalk:CreateEnvironment", 
        "elasticbeanstalk:CreateApplication", 
        "s3:CreateBucket" 
      ], 
      "Resource": "*", 
      "Condition": { 
        "StringNotEqualsIfExists": { 
          "aws:RequestTag/Account": [ 
            "Audit", "Automation", "Backup", "Delegated", "Egress",  
            "Finops", "Inspection", "Logs-archive", "MFA", "Network",  
            "Sandbox", "Shared-services", "Tekes", "Tekes-dev",  
            "Workspaces", "Cnapp" 
          ], 
          "aws:RequestTag/Division": [ 
            "Information technology communication services", 
            "Applications Development Division", 
            "Cyber Security Technologies Bureau" 
          ], 
          "aws:RequestTag/Environment": [ 
            "production", "development", "test" 
          ] 
        } 
      } 
    } 
  ] 
}

问题1:此SCP是否是阻止缺失指定标签或标签值为空的资源创建的正确方案?

这个SCP的核心逻辑是正确的,但存在覆盖范围的局限:

  • 第一个语句通过Null条件判断标签是否存在,能有效阻止未携带指定标签的资源创建,但仅覆盖了列出的服务动作,无法管控其他资源类型。
  • 第二个语句通过StringEquals拦截空标签值,逻辑成立,但需注意部分服务对空标签的API处理差异,建议针对重点服务做测试验证。
  • 第三个语句用StringNotEqualsIfExists强制标签值在指定列表,配合前两个语句的逻辑,能确保标签存在且值合规,但同样受限于当前列出的服务动作。

整体方向没问题,但需要扩展覆盖范围才能实现全局管控。

问题2:是否有更优的AWS原生特性可在资源创建阶段强制标签?

目前AWS原生方案中,SCP是全局预防性管控的最优选择,没有更合适的替代方案:

  • 标签策略+Config规则属于事后检测/修复,无法在创建阶段拦截不合规资源;
  • IAM权限策略可实现类似控制,但需要在每个账号单独配置,无法通过Organizations批量管控,效率远低于SCP;
  • 部分服务(如EC2)的启动模板、自动扩缩容组支持强制标签,但仅针对单一服务,无法实现全局覆盖。

问题3:如何扩展该SCP以覆盖所有资源类型,而非仅当前列出的类型?

要实现全资源覆盖,需遵循以下步骤:

  1. 收集全量服务创建动作:AWS资源创建动作命名规则通常为服务缩写:CreateXXX(如sns:CreateTopic、sqs:CreateQueue、logs:CreateLogGroup),可通过AWS官方服务参考文档整理完整列表。
  2. 处理特殊服务标签逻辑:
    • 少数边缘服务的创建动作不支持aws:RequestTag上下文,需单独验证,这类资源可结合事后Config规则补充管控;
    • EC2的RunInstances通过TagSpecifications参数传递标签,SCP中的aws:RequestTag依然能正常生效,需确保该动作被包含。
  3. 优化SCP语句结构:将所有创建动作合并到统一语句中,减少重复配置,示例如下:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "DenyNonCompliantResourceCreation",
          "Effect": "Deny",
          "Action": [
            "ec2:RunInstances",
            "rds:CreateDBInstance",
            "eks:CreateCluster",
            "lambda:CreateFunction",
            "dynamodb:CreateTable",
            "cloudformation:CreateStack",
            "s3:CreateBucket",
            "sns:CreateTopic",
            "sqs:CreateQueue",
            "logs:CreateLogGroup"
            // 继续添加其他服务的Create动作
          ],
          "Resource": "*",
          "Condition": {
            "Or": [
              {
                "Null": {
                  "aws:RequestTag/Account": "true",
                  "aws:RequestTag/Division": "true",
                  "aws:RequestTag/Environment": "true"
                }
              },
              {
                "StringEquals": {
                  "aws:RequestTag/Account": "",
                  "aws:RequestTag/Division": "",
                  "aws:RequestTag/Environment": ""
                }
              },
              {
                "StringNotEqualsIfExists": {
                  "aws:RequestTag/Account": ["Audit", "Automation", ...],
                  "aws:RequestTag/Division": ["Information technology communication services", ...],
                  "aws:RequestTag/Environment": ["production", "development", "test"]
                }
              }
            ]
          }
        }
      ]
    }
    
  4. 测试与迭代:先在Sandbox组织单元或测试账号中验证SCP效果,确认不同服务的创建动作被正确拦截后,再逐步推广到生产环境。

最佳实践建议

  • 小范围测试先行:避免直接在全组织启用SCP,先在非生产环境验证,防止影响正常业务;
  • 组合管控策略:用SCP做预防性拦截,搭配标签策略自动补全边缘资源标签,用Config规则监控遗漏的不合规资源;
  • 标准化创建流程:在控制台创建资源时,使用预设必填标签的CloudFormation模板或Quick Starts,减少手动输入的遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:39:59