第 2 步:在 AWS 管理控制台中创建代理服务 (Amazon API Gateway)¶
Snowflake 不会直接向远程服务发送数据(HTTP POST 请求)。相反,Snowflake 将数据发送到代理服务,该代理服务将数据中继到远程服务(例如 AWS Lambda Function)并再次返回。
本主题说明了如何创建和配置 Amazon API Gateway 以用作外部函数的代理服务。
将 Amazon API Gateway 配置为代理服务需要几个步骤,其中包括:
在 AWS 账户中创建新的 IAM (身份和访问管理)角色。
创建并配置 Amazon API Gateway 端点。
保护 Amazon API Gateway 端点。
在 Snowflake 中创建 API 集成对象。
在 Snowflake 和新的 IAM 角色之间建立信任关系。
创建这些的步骤是交错的,因为:
API 集成需要来自 API Gateway 的信息,例如角色的 ARN (Amazon 资源名称)。
API Gateway 需要来自 API Integration 的信息,例如 API_AWS_EXTERNAL_ID 和 API_AWS_IAM_USER_ARN。
本主题内容:
上一步¶
在 AWS 账户中创建新的 IAM 角色¶
要使 Snowflake 对 AWS 账户进行身份验证,必须对 Snowflake 拥有的 IAM (身份和访问管理)用户授予在 AWS 账户中担任 IAM 角色的权限。
创建 IAM 角色的步骤如下:
创建新的 IAM 角色:在 AWS 控制台中,搜索 IAM,点击 Roles,然后点击 Create Role。
当要求选择受信任实体的类型时,选择 Another AWS account。
当系统要求 Specify accounts that can use this role 时,从名为
Your AWS Account ID
的工作表字段中粘贴值。(使用 AWS 账户 ID,而不是 Snowflake 的。Snowflake ARN 稍后将与此 IAM 角色关联。)
点击 Next: Permissions。
(可选)设置权限(Attach permissions policies)。
点击 Next: Tags。
有选择地添加标签。
点击 Next: Review。
输入角色名称。
在工作表的
New IAM Role Name
字段中记录角色名称。
点击 Create role 按钮。创建角色后:
在工作表的
New IAM Role ARN
字段中记录 Role ARN。
创建 API Gateway 端点¶
在创建和配置 API Gateway 之前,请选择是使用区域端点还是专用端点。有关更多信息,请参阅 选择端点类型:区域端点与专用端点。
如果您计划使用专用端点,则需要在跟踪工作表中记录的 VPC (虚拟私有云)ID。
创建 API Gateway 端点的步骤如下:
在 AWS 管理控制台中,选择 API Gateway。
选择 Create API。
选择端点(区域或专用)的类型。
如果您想选择 区域 端点,则:
找到 REST API 并点击它的 Build 按钮。
如果您想选择一个 专用 端点,则:
找到 REST API private 并点击它的 Build 按钮。
重要
确保您选择 REST API 或 REST API private。不要选择 HTTP API 或其他选项。
选择 New API 选项。
输入新 API 的名称。
在工作表的
New API Name
字段中记录此名称。如果要求选择 Endpoint Type,请选择 Regional 或 Private。
将
VPC Endpoint IDs
字段留空。点击 Create API 按钮。
若要创建资源,请点击 Actions,然后点击 Create Resource。
在工作表的
API Gateway Resource Name
字段中记录资源名称。点击 Create Resource 按钮。屏幕显示 No methods defined for the resource.
若要创建新方法,请点击 Actions 并选择 Create Method。
在资源名称下的小下拉菜单框中,选择 POST,然后点击它旁边的灰色复选标记。
Integration type 应为 Lambda Function。如果尚未选择,请选择它。
选中复选框 Use Lambda Proxy integration。
选择 Lambda 代理集成很重要,因为没有 Lambda 代理集成的 JSON 不同于有 Lambda 代理集成的 JSON。有关 Lambda 代理集成的更多信息,请参阅以下 AWS 文档:
Lambda 集成 (https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-with-lambda-integration.html)
API 发展 (https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html)
在 Lambda Function 字段中,粘贴您在工作表中记录的
Lambda Function Name
。点击 Save 按钮。
点击 Actions 按钮,然后选择 Deploy API 操作。
选择或创建暂存区。点击 Deploy。
在资源名称下面,您应该看到 POST。
如果您没有看到这一点,您可能需要通过点击资源名称左侧的三角形来展开资源树。
点击 POST,然后在工作表的
Resource Invocation URL
字段中记录 POST 请求的 Invoke URL。确保调用 URL 包含您创建的资源的名称;如果它没有包含该名称,您可能需点击暂存区的调用 URL,而不是资源。
点击 Save Changes。
测试 API Gateway¶
检查 API Gateway 是否能调用 Lambda Function。
遵循 AWS 的测试说明 (https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-validation-test.html#api-gateway-request-validation-test-in-console)。
在 AWS 说明的相应步骤中,将以下文本粘贴到 Request Body:
{ "data": [ [0, 43, "page"], [1, 42, "life, the universe, and everything"] ] }
在执行测试之后,您应该会看到 Request, Status, Latency, and Response Body 出现在右侧(您可能需滚动才能看到它)。
如果返回的状态为 200,则 API Gateway 调用了正确的 Lambda Function。
(验证步骤跳过身份验证,因此不会发现权限问题。)
保护您的 Amazon API Gateway 端点¶
有关保护代理服务端点(如 Amazon API Gateway 端点)的概述,请参阅 保护代理服务。
要保护 Amazon API Gateway 端点,请执行以下操作:
此时,您应该出现在显示 API Gateway 信息的屏幕上,并且应看到您的资源和 POST 方法。
如果您还没有出现在该屏幕上,请执行以下操作:
在 AWS 管理控制台中,转到 API Gateway 页面。
选择 API 网关。
在左侧窗格中,点击 Resources。
点击 POST 方法。(如果您没有看到该方法,通过点击 Resources 窗格中的资源左侧三角形来展开资源树,通常是从左边数起第二个窗格。
将 Method Request ARN 从 Method Request 方框复制到工作表中的
Method Request ARN
字段。点击标题 Method Request。
点击 Authorization 旁边的编辑符号并选择
AWS_IAM
,以指定方法请求所需的 AWS_IAM 授权。点击菜单旁边的小复选标记,以确认您的选择。
若要设置 API Gateway 的资源策略以指定谁有权调用网关端点,请点击 API 窗口左侧列中的 Resource Policy。
区域端点:
将下面的 JSON 格式资源策略模板粘贴到资源策略编辑器中,然后使用工作表中的相应值替换占位符,如下所述。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:sts::<12-digit-number>:assumed-role/<external_function_role>/snowflake" }, "Action": "execute-api:Invoke", "Resource": "<method_request_ARN>" } ] }
替换资源策略的以下部分:
用记录于工作表的
Your AWS Account ID
字段中的值替换<12-digit-number>
。用工作表中
New IAM Role Name`字段中的角色名称替换 :code:`<external_function_role>
。例如,如果 AWS 角色名称为:
arn:aws:iam::987654321098:role/MyNewIAMRole
那么结果应是:
"AWS": "arn:aws:sts::987654321098:assumed-role/MyNewIAMRole/snowflake"
用工作表的
Method Request ARN
字段中的值换<method_request_ARN>
。这是资源的 POST 方法的 ARN。备注
将资源设置为 Method Request ARN 可指定:API Gateway 应仅允许对指定资源的调用。可以将 Method Request ARN 的子集指定为前缀,这允许从相同的 API Gateway 调用多个资源。
例如,如果 Method Request ARN 是:
arn:aws:execute-api:us-west-1:123456789012:a1b2c3d4e5/*/POST/MyResource
然后您可以只指定以下前缀:
arn:aws:execute-api:us-west-1:123456789012:a1b2c3d4e5/*
仅限美国政府 GovCloud 用户:
更新 Method Request ARN 以使用
aws-us-gov
,例如:arn:aws-us-gov:execute-api:us-gov-west-1:123456789012:a1b2c3d4e5/*
请确保使用 GovCloud 区域,例如
us-gov-west-1
。
专用端点:
将下面的资源策略模板粘贴到资源策略编辑器中,然后使用工作表中的相应值替换占位符,如下所述。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:sts::<12-digit-number>:assumed-role/<external_function_role>/snowflake" }, "Action": "execute-api:Invoke", "Resource": "<method_request_ARN>", "Condition": { "StringEquals": { "aws:sourceVpc": "<VPC_ID>" } } } ] }
替换资源策略的以下部分:
如上文所述,为区域端点替换 <12-digit-number>、<external_function_role> 和 <method_request_ARN>。
为您所在区域用 Snowflake VPC ID 替换 <VPC_ID>,该操作应记录于工作表中的
Snowflake VPC ID
字段。仅限美国政府 GovCloud 用户:
更新 Method Request ARN 以使用
aws-us-gov
,例如:arn:aws-us-gov:execute-api:us-gov-west-1:123456789012:a1b2c3d4e5/*
请确保使用 GovCloud 区域,例如
us-gov-west-1
。
点击 Save,以保存资源策略。
部署更新的 API。若要执行此操作,请点击页面顶部的面包屑导航中的 API 名称。点击 Actions,然后点击 Deploy API。请选择您部署的暂存区并点击 Deploy。
在下一步中,您将创建一个 Snowflake API 集成对象。现在请不要关闭 AWS 管理控制台窗口;您稍后必须返回该窗口。