Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用查询 API

以下各节讨论用于查询 API 的参数和请求身份验证。

查询参数

HTTP 基于查询的请求是指使用 HTTP 动作 GET 或 POST 的 HTTP 请求,查询参数的名称为 Action

每个查询请求必须包括一些通用参数,以处理操作的身份验证和选择事宜。

有些操作会使用参数列表。这些列表都是使用 param.n 表示法指定的。n 值是从 1 开始的整数。

有关 Amazon RDS 区域和终端节点的更多信息,请转到 Amazon Web Services 一般参考中“区域和终端节点”部分的 Amazon Relational Database Service (RDS)

查询请求身份验证

您只能通过 HTTPS 发送查询请求,并且每个查询请求中必须包含签名。您必须使用签名版本 2 或者签名版本 4。本节描述了如何创建签名版本 2。有关创建签名版本 4 的信息,请参阅 Signature Version 4 签名过程

下面介绍了对发送至 AWS 的请求进行身份认证所采用的基本步骤。此过程假定您已向 AWS 注册,并且有一个访问密钥 ID 和秘密访问密钥。

提示

您可以在 AWS 您的账户页面上的安全凭证一节中找到访问密钥 ID 和秘密访问密钥。

对发送到 AWS 的请求进行身份验证

  1. 发件人构建一个将要发送至 AWS 的请求。

  2. 发件人计算请求签名,即带有一个 SHA-1 散列函数的键控式散列信息验证码 (HMAC),如本主题下一部分中所定义的那样。

  3. 请求的发件人将请求数据、签名和访问密钥 ID (即所使用的秘密访问密钥的密钥标识符) 发送至 AWS。

  4. AWS 使用访问密钥 ID 查找秘密访问密钥。

  5. 通过使用与计算请求签名相同的算法,AWS 会从请求数据和秘密访问密钥中生成一个签名。

  6. 如果签名匹配,那么请求将被视为可信。如果比较签名这一操作失败,那么请求将被丢弃,同时 AWS 将返回一份错误响应。

注意

如果请求包含一个 Timestamp 参数,那么针对请求计算的签名将在被赋予值后的 15 分钟失效。如果请求包含一个 Expires 参数,那么签名将在 Expires 参数指定的时间失效。

计算请求签名

  1. 创建标准化的查询字符串,您在此过程的稍后部分需要用到它:

    1. 根据参数名称、按照自然字节排序对 UTF-8 查询字符串组成部分进行分类。参数可取自 GET URI 或 POST 正文 (当内容类型为 application/x-www-form-urlencoded 时)。

    2. URL 根据以下规则对参数名称和值进行编码:

      1. 不对任何由 RFC 3986 定义的非预留字符进行 URL 编码。这些未预留字符是 A – Z、a – z、0 – 9、连字符 ( - )、下划线 ( _ )、句号 ( . ) 和波浪符 ( ~ )。

      2. 对含有 XY% 的所有其他字符进行百分数编码,其中 X 和 Y 分别为十六进制字符 0 – 9 和大写字母 A – F。

      3. 以 %XY%ZA... 格式对扩展的 UTF-8 字符进行百分号编码。

      4. 将空白字符百分号编码为 %20 (不是普通编码方案中的 +)。

    3. 使用等号 ( = ) (ASCII 字符 61) 将编码的参数名称与它们的编码值分隔开,即使参数值为空,亦应如此。

    4. 使用“和”符号 (&) (ASCII 代码 38) 隔开名称/值对。

  2. 依照下列伪语法创建用以签名的字符串 (“\n”代表 ASCII 换行)。

    StringToSign = HTTPVerb + "\n" + ValueOfHostHeaderInLowercase + "\n" + HTTPRequestURI + "\n" + CanonicalizedQueryString <from the preceding step>

    HTTPRequestURI 组件是 URI 的 HTTP 绝对路径组件,但不包括查询字符串。如果 HTTPRequestURI 为空,则使用正斜杠 ( / )。

  3. 利用您刚创建的字符串计算符合 RFC 2104 的 HMAC,将您的秘密访问密钥当作密钥,并将 SHA256 或 SHA1 作为散列算法。

    有关更多信息,请参阅 RFC 2104.

  4. 将结果值转换为 base64。

  5. 将此值作为请求中的 Signature 参数值。

例如,下面是一个示例请求 (为清晰起见,添加了换行符)。

https://rds.amazonaws.com/ ?Action=DescribeDBInstances &DBInstanceIdentifier=myinstance &Version=2010-01-01 &Timestamp=2010-05-10T17%3A09%3A03.726Z &SignatureVersion=2 &SignatureMethod=HmacSHA256 &AWSAccessKeyId=<Your AWS Access Key ID>

对于之前的查询字符串,您可通过以下字符串计算 HMAC 签名。

GET\n rds.amazonaws.com\n AWSAccessKeyId=<Your AWS Access Key ID> &Action=DescribeDBInstances &DBInstanceIdentifier=myinstance &Timestamp=2010-05-10T17%3A09%3A03.726Z &SignatureMethod=HmacSHA256 &SignatureVersion=2 &Version=2009-10-16

结果是下面的已签名请求。

https://rds.amazonaws.com/ ?Action=DescribeDBInstances &DBInstanceIdentifier=myinstance &Version=2010-01-01 &Timestamp=2010-05-10T17%3A09%3A03.726Z &Signature=<URLEncode(Base64Encode(Signature))> &SignatureVersion=2 &SignatureMethod=HmacSHA256 &AWSAccessKeyId=<Your AWS Access Key ID>