

# 使用适用于 Athena 的 CalledVia 上下文密钥
<a name="security-iam-athena-calledvia"></a>

[主体](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal) 向 AWS 提交[请求](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-request)时，AWS 会将请求信息收集到*请求上下文*，以评估并授权该请求。您可以使用 JSON 策略的 `Condition` 元素将请求上下文中的键与您在策略中指定的键值进行比较。*全局条件上下文键*是带 `aws:` 前缀的条件键。

## 关于 aws:CalledVia 上下文密钥
<a name="security-iam-athena-calledvia-the-awscalledvia-context-key"></a>

您可以使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-calledvia) 全局条件上下文键将策略中的服务与代表 IAM 主体（用户或角色）发出请求的服务进行比较。主体向 AWS 服务 发出请求时，该服务可能会使用主体的凭证向其他服务发出后续请求。`aws:CalledVia` 键包含链中代表主体发出请求的每个服务的有序列表。

通过指定 `aws:CalledVia` 上下文键的服务主体名称，您可以将上下文键设置为特定于 AWS 服务。例如，您可以使用 `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 函数
<a name="security-iam-athena-calledvia-example-policy-to-add-an-optional-calledvia-context-key-for-fine-grained-access-to-a-lambda-function"></a>

Athena 要求调用者有 `lambda:InvokeFunction` 权限，以便调用与查询关联的 Lambda 函数。以下语句指定用户只能通过 Athena 调用 Lambda 函数。

------
#### [ JSON ]

****  

```
{
    "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 函数。

------
#### [ JSON ]

****  

```
{
    "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 用户指南*》中的 [AWS 全局条件上下文键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。