将 Athena 与 CalledVia 上下文键结合使用 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

将 Athena 与 CalledVia 上下文键结合使用

主体 向 Amazon 提交请求时,Amazon 会将请求信息收集到请求上下文,以评估并授权该请求。您可以使用 JSON 策略的 Condition 元素将请求上下文中的键与您在策略中指定的键值进行比较。全局条件上下文键是带 aws: 前缀的条件键。

aws:CalledVia 上下文键

您可以使用 aws:CalledVia 全局条件上下文键将策略中的服务与代表 IAM 委托人(用户或角色)发出请求的服务进行比较。主体向 Amazon Web Service 发出请求时,该服务可能会使用主体的凭证向其他服务发出后续请求。aws:CalledVia 键包含链中代表主体发出请求的每个服务的有序列表。

通过指定 aws:CalledVia 上下文键的服务主体名称,您可以将上下文键设置为特定于 Amazon Web Service。例如,您可以使用 aws:CalledVia 条件键将请求限制为仅从 Athena 发出的请求。要借助 Athena 在策略中使用 aws:CalledVia 条件键,您可以指定 Athena 服务委托人名称 athena.amazonaws.com,如以下示例所示。

... "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": "athena.amazonaws.com" } } ...

您可以使用 aws:CalledVia 上下文键来确保调用者只有在从 Athena 调用资源时才能访问资源(如 Lambda 函数)。

注意

aws:CalledVia 上下文键与可信身份传播功能不兼容。

添加一个可选的 CalledVia 上下文密钥,用于对 Lambda 函数进行细化访问

Athena 要求调用者有 lambda:InvokeFunction 权限,以便调用与查询关联的 Lambda 函数。以下语句允许对 Lambda 函数进行细粒度访问,以便用户只能使用 Athena 调用 Lambda 函数。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor3", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-1:111122223333:function:OneAthenaLambdaFunction", "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": "athena.amazonaws.com" } } } ] }

下例说明了将前一语句添加到策略中以允许用户运行和读取联合查询。允许执行这些操作的委托人可以运行指定与联合数据源关联的 Athena 目录的查询。但是,除非通过 Athena 调用该函数,否则委托人无法访问关联的 Lambda 函数。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "athena:GetWorkGroup", "s3:PutObject", "s3:GetObject", "athena:StartQueryExecution", "s3:AbortMultipartUpload", "athena:StopQueryExecution", "athena:GetQueryExecution", "athena:GetQueryResults", "s3:ListMultipartUploadParts" ], "Resource": [ "arn:aws:athena:*:111122223333:workgroup/WorkGroupName", "arn:aws:s3:::MyQueryResultsBucket/*", "arn:aws:s3:::MyLambdaSpillBucket/MyLambdaSpillPrefix*" ] }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "athena:ListWorkGroups", "Resource": "*" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::MyLambdaSpillBucket" }, { "Sid": "VisualEditor3", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:*:111122223333:function:OneAthenaLambdaFunction", "arn:aws:lambda:*:111122223333:function:AnotherAthenaLambdaFunction" ], "Condition": { "ForAnyValue:StringEquals": { "aws:CalledVia": "athena.amazonaws.com" } } } ] }

有关 CalledVia 条件键的更多信息,请参阅《IAM 用户指南》中的 Amazon 全局条件上下文键