掘金 后端 ( ) • 2024-06-21 14:35

theme: smartblue

原文链接:AWS ARN Explained: Amazon Resource Name Guide

image.png

在这篇博客中,我将讨论与 AWS ARN 相关的概念、技巧和窍门,并解释如何为特定的 AWS 资源创建 ARN URL。

我还添加了所有重要的 AWS 资源链接,方便你快速生成所需的 ARN。

什么是 AWS 中的 ARN?

Amazon Resource Names (ARNs) 是用于标识各个 AWS 资源的唯一标识符。这些资源可以包括 EC2 实例、EBS 卷、S3 存储桶、负载均衡器、VPC、路由表等。

一个 EC2 实例 ARN 格式如下。

arn:aws:ec2:us-east-1:4575734578134:instance/i-054dsfg34gdsfg38

为什么 ARN 很重要?

ARN 在 IAM 策略(Policy)中非常重要。如果你遵循 IAM 角色(Role)和策略的标准安全最佳实践,你将需要使用 ARN。

ARN 有以下主要用途。

  1. 它们用于 IAM 策略中,以授予对资源的精细化访问权限。例如,可以允许特定的 IAM 用户仅访问特定的 EC2 实例。
  2. 它可以在基础设施即代码脚本和 API 调用中引用其他资源。你可以在 Terraform IAM 角色创建的博客中看到一个实际的例子。

如果你不理解上述要点,不用担心,我们将在接下来的主题中用实际例子进行讲解。

AWS ARN 格式

通常情况下,你可以按照以下格式自行构建 ARN URL。

arn:aws:service:region:account-id:resource-id
arn:aws:service:region:account-id:resource-type/resource-id
arn:aws:service:region:account-id:resource-type:resource-id

在上述格式中,从上到下,你可以看到格式的差异,这些差异会根据资源类型而变化。

这是所有三种格式的 ARN 示例。

S3 ARN 示例:S3 具有扁平的存储桶层级结构及相关对象。以下是一个 S3 ARN 的样子

arn:aws:s3:::devopscube-bucket

EC2 ARN 示例:ec2 服务有子资源类型,如 image, security groups 等。以下示例的 resource-typeinstance

arn:aws:ec2:us-east-1:4575734578134:instance/i-054dsfg34gdsfg38

Lambda ARN 示例:Lambda 函数可以有多个版本。此处的版本号是限定符。要获取特定 Lambda 版本的 ARN,你需要在最后注明版本号,如下所示

arn:aws:lambda:us-east-1:4575734578134:function:api-fucntion:1

如何获取 AWS 资源的 ARN?

如果你刚开始使用 AWS,可能会发现很难拼凑出资源的正确 ARN URL。

你可以在这里找到所有 AWS 服务的 ARN 格式。

例如,在那份 AWS 文档中,如果你从列表中选择 EC2 资源,并向下滚动到 「Amazon EC2 定义的资源类型」部分,你会看到所有 EC2 子资源类型的参考,如下所示。

aws arn reference document

另一种方法是使用 AWS 策略生成器来创建策略。

在策略生成器中,当你选择策略资源时,它会自动显示 ARN 建议,如下所示。你只需添加资源信息即可。

img

ARN 通配符

ARN 定义支持使用通配符。在许多情况下,你将需要使用通配符。

假如你需要一个 IAM 策略来允许访问某个存储桶中的所有对象,你可以像下面这样使用通配符 arn。

arn:aws:s3:::my-data-bucket/*

这是一个在 IAM 策略中使用通配符 ARN 的示例。此策略允许对 dcubebucke 的 S3 存储桶执行所有操作。

{
"Version": "2012-10-17",
"Statement": [{
"Sid": "Stmt1596173683332",
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::dcubebucket",
"arn:aws:s3:::dcubebucket/*"
]
}]
}

这是一个允许对所有 EMR 集群进行有限访问的示例策略。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1596174145144",
      "Action": [
        "elasticmapreduce:AddInstanceFleet",
        "elasticmapreduce:AddTags",
        "elasticmapreduce:DescribeCluster",
        "elasticmapreduce:DescribeEditor",
        "elasticmapreduce:DescribeJobFlows",
        "elasticmapreduce:DescribeSecurityConfiguration"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:elasticmapreduce:*:*:cluster/*"
    }
  ]
}

从 AWS 命令行界面获取 ARN

你可以通过 CLI 获取特定资源的 ARN。

对于所有的 IAM 角色、策略和用户,你可以通过在 CLI 中使用描述命令获取 ARN。

这是一个获取角色 ARN 的示例。

aws iam get-role --role-name EMR_DefaultRole

这是包含 arn 的输出。

img

你可以这样尝试描述资源,看看是否会输出 ARN。

从 AWS 管理控制台获取 ARN

你可以直接在 AWS 控制台中获取 IAM 资源的 ARN。

只需浏览到特定资源,你将在页面顶部看到相关的 ARN,如下图所示。

img

在 Cloudformation 中将 ARN 作为输出获取

如果你使用 Cloudformation,你可以在输出中通过函数 Fn::GetAtt 获取资源的 arn

这是一个获取 Lambda 函数 ARN 的示例语法。

resources:
  Outputs:
    LamdaFunctionArn:
      Export:
        Name: MyFucntionARN
      Value:
        Fn::GetAtt: MyLambdaFunction.Arn

获取主体的 ARN 信息

当你创建 S3 存储桶策略、SNS 主题、VPC 端点和 SQS 策略时,需要指定一个主体参数。

Principal 是否在策略中指定为 ARN 的可信来源,以允许或拒绝对资源的访问

例如,如果你希望某个 S3 存储桶仅由特定用户访问,你需要在策略中将用户的 arn 指定为 Principal

如果你使用策略生成器来创建这些策略,你会看到如下所示的主体选项。

img

你主要需要指定用户、账户和角色 ARN 作为主体。此外,还有其他主体来源。请参阅此 AWS 文档以了解更多详情。

获取用户 ARN

如果你在 AWS 控制台中查看用户页面,你将看到如下所示的用户 ARN。

img

AWS 账户 ARN

AWS 账户 ARN 的语法如下。请将 account-id 替换为你的账户 ID。

arn:aws:iam::<account-id>:root

获取 AWS 角色 ARN

你可以按照上面部分的说明,从 CLI 中获取 IAM 角色的 ARN。

如果你通过网页控制台进入 IAM –> 角色 –> 你的角色,你可以看到如下所示的 ARN。

注意:如果你在使用 EC2 实例,可能需要与 IAM 策略关联的实例配置文件 ARN。

img