如何在应用 AWS 策略之前验证 ARN?

How to validate an ARN before applying an AWS policy?

我在一个配置文件中有一个来自众多账户的 ARN 列表,然后将其构建到 S3 存储桶策略中。但是,如果其中一个 ARN 无效,比如 arn:aws:iam::12345679012:user/foo-bar,那么在尝试应用包含该 ARN 的策略时我将收到以下异常:

lib/aws/core/client.rb:375:in `return_or_raise': Invalid principal in policy (AWS::S3::Errors::MalformedPolicy)

如果我文件中的任何 ARN 被删除,这似乎会导致问题。然后,我无法附加到现有政策。我必须找出哪个 ARN 是 "poison pill" 并将其删除。但是异常消息并没有向我提供该信息。

问题:

  1. 是否有更好的方法来管理大量我无法控制的跨账户 ARN?
  2. 有没有办法在将 ARN 应用于 S3 存储桶策略之前验证它是否存在?

您的问题没有具体说明 ruby,所以我将向您展示我是如何使用 Python Boto3 库处理这个问题的(我怀疑很糟糕)。

尝试使用多个 ARN 更新代入角色策略时,一个或多个无效。这是产生错误的 boto 调用:

try:
  iamClient.update_assume_role_policy(RoleName=curated_role_name, PolicyDocument=json.dumps(assume_role_policy_document))
except botocore.exceptions.ClientError as e:
  print (e.response['Error']['Message'])

上述代码片段的结果是:

Invalid principal in policy: "AWS":"arn:aws:iam::42xxxxx:user/idontexist"

然后我做了一个简单的 RE 来提取错误的 ARN,然后尝试重新应用我的更新。如果列表中仍有错误的 ARN,那么我将获取列表中的下一个并将其删除。这会递归,直到政策被接受。

我正在搜索与您完全相同的东西 - "ARN Validator"。没找到,只好自己处理了。我考虑过检查一个单独函数中涉及的所有 ARN,但由于我 运行 很少涉及这个问题,所以我不想承担开销。

希望其中的一些内容对您有所帮助。

戴夫欧