ECS サービスインターフェイスの呼び出しは、HTTP リクエストを ECS サーバーに (HTTP または HTTPS チャネルを介して) 送信し、このリクエストに対する ECS サーバーの応答を受信することで行われます。ECS サーバーはユーザーリクエストを受信した後に、そのリクエストに対して必要な認証とパラメーターの検証を実行します。すべての検証で問題がなければ、そのリクエスト用に指定されたパラメーターに基づき、関連する操作が送信または実行されます。その後、処理結果が HTTP 応答として呼び出し元に返されます。

リクエストは以下の部分で構成されます。

HTTP メソッド - 現在、どの ECS サービスインターフェイスも GET メソッドによる呼び出しのみをサポートしています。

リクエスト URL - リクエスト URL には、リクエストのサービスアドレス、実行する操作名、操作パラメーター、パブリックリクエストパラメーターが含まれます。

サーバーアドレス: ECS サービスドメイン名は http://ecs.aliyuncs.com/https://ecs.aliyuncs.com/ です。リクエストのセキュリティを確保するために、HTTPS チャネルの使用を強くお勧めします (HTTPS は暗号化通信用の SSL 層を備えており、機密情報の漏洩につながる通信の傍受を防止できます)。

操作名: 各インターフェイスに、実行する操作の名前を Action パラメーターとして指定する必要があります。

操作パラメーター: 実行する操作に応じて、個別の操作パラメーターを設定する必要があります。詳細については、各インターフェイスについての説明を参照してください。

パブリックリクエストパラメーター: TimeStamp や Signature などのパラメーターを各リクエストに含める必要があります。

サーバーでユーザーの ID を正確に認証し、リクエストの実行を許可するには、処理の送信に先立って、リクエストに署名する必要があります。署名ルールについては、「署名メカニズム」のセクションを参照してください。

サーバーはリクエストの処理を完了した後、応答結果を返します。応答結果は、正常な結果かエラーメッセージのいずれかに分類されます。結果の形式については、「返される結果」のセクションをご確認ください。クライアントは応答メッセージの本文を解析し、実行結果を取得することができます。

呼び出しの例

DescribeRegions インターフェイスを例にとります。

対応する Action は DescribeRegions で、必要な操作パラメーターは RegionId です (ECS では、必要なリージョンリストを照会するためのインターフェイスを使用して、すべての RegionId を取得できます)。すべてのパブリックリクエストパラメーター (Signature を除く) を追加した後のリクエスト URL は次のようになります (見やすくするために、URL エンコーディング前の URL を記載しています)。

http://ecs.aliyuncs.com/?TimeStamp=2012-12-26T10:33:56Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2014-05-26&SignatureVersion=1.0

まず、署名計算ルールに従って、正規化クエリ文字列を作成します。

http://ecs.aliyuncs.com/?TimeStamp=2012-12-26T10:33:56Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2014-05-26&SignatureVersion=1.0

続いて、特定の値を持つ署名文字列 StringToSign を作成します。

GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeRegions&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3DNwDAxvLU6tFE0DVb&SignatureVersion%3D1.0&TimeStamp%3D2012-12-26T10%253A33%253A56Z&Version%3D2014-05-26

以下の Java サンプルコードでは、パブリックリクエストパラメーターを追加する方法、リクエストパラメーターから正規化クエリ文字列を作成する方法、StringToSign を作成する方法を示しています。この例では前提として、すべてのリクエストパラメーターが Map<String, String> オブジェクトに格納されること、および Access Key ID が testid であることを想定しています。

    final String HTTP_METHOD = "GET";

    Map<String, String> parameters = new HashMap<String, String>();
    // Add public request parameters
    parameters.put("Action", "DescribeRegions");
    parameters.put("Version", "2014-05-26");
    parameters.put("AccessKeyId", "testid");
    parameters.put("TimeStamp", formatIso8601Date(new Date()));
    parameters.put("SignatureMethod", "HMAC-SHA1");
    parameters.put("SignatureVersion", "1");
    parameters.put("SignatureNonce", UUID.randomUUID().toString());
    parameters.put("Format", "XML");

    // Sort the parameters
    String[] sortedKeys = parameters.keySet().toArray(new String[]{});
    Arrays.sort(sortedKeys);

    final String SEPARATOR = "&";

    // Generate the stringToSign
    StringBuilder stringToSign = new StringBuilder();
    stringToSign.append(HTTP_METHOD).append(SEPARATOR);
    stringToSign.append(percentEncode("/")).append(SEPARATOR);

    StringBuilder canonicalizedQueryString = new StringBuilder();
    for(String key : sortedKeys) {
        // Be sure to encode the key and value
        canonicalizedQueryString.append("&")
        .append(percentEncode(key)).append("=")
        .append(percentEncode(parameters.get(key)));
    }

    // Be sure to encode the canonicalizedQueryString
    stringToSign.append(percentEncode(
        canonicalizedQueryString.toString().substring(1)));

この例では、TimeStamp パラメーターが ISO8601 標準に準拠する必要があることに注意してください。さらに、UTC 時刻が用いられていることにも留意します。これらを満たさないと、リクエストはエラーになります。次のサンプルコードは、標準に準拠した TimeStamp 文字列の生成方法を示します。

    private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    private static String formatIso8601Date(Date date) {
        SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        return df.format(date);
    }

正規化クエリ文字列 (この例では canonicalizedQueryString 変数) と StringToSign を生成する際に、これらの両方をエンコードする必要があります。エンコーディングルールについては、「署名メカニズム」のセクションで詳述しています。次のサンプルコードは、java.net.URLEncoder クラスを使用してエンコーディングを実行する方法を示します。

    private static final String ENCODING = "UTF-8";

    private static String percentEncode(String value) throws UnsupportedEncodingException {
        return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
    }

“Access Key ID” を “testid”、”Access Key Secret” を “testsecret”、HMAC の計算に使用する Key を “testsecret&” とすると、次の署名値が計算されます。

            SDFQNvyH5rtkc9T5Fwo8DOjw5hc=

署名を計算するサンプルコード (Java) を以下に示します。

    // The following is a sample code for signature calculation
    final String ALGORITHM = "HmacSHA1";
    final String ENCODING = "UTF-8";
    key = "testsecret&";

    Mac mac = Mac.getInstance(ALGORITHM);
    mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
    byte[] signData = mac.doFinal(stringToSign.getBytes(ENCODING));

    String signature = new String(Base64.encodeBase64(signData));

Signature パラメーターを追加した後、RFC3986 ルールに従って URL エンコーディングを実行すると、次のような結果が得られます。

http://ecs.aliyuncs.com/?TimeStamp=2012-12-26T10%3A33%3A56Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&RegionId=region1&SignatureNonce=NwDAxvLU6tFE0DVb&Version=2012-09-13&SignatureVersion=1.0&Signature=SDFQNvyH5rtkc9T5Fwo8DOjw5hc%3d

次に HTTP リクエストを上記の URL に送信し、次のようなリクエストに対する ECS サーバーの応答を受信します。

<DescribeRegionsResponse>
    <Regions>
        <Region>
            <LocalName>Qingdao node</LocalName>
            <RegionId>cn-qingdao</RegionId>
        </Region>
        <Region>
            <LocalName>Hangzhou node</LocalName>
            <RegionId>cn-hangzhou</RegionId>
        </Region>
    </Regions>
    <RequestId>833C6B2C-E309-45D4-A5C3-03A7A7A48ACF</RequestId>
</DescribeRegionsResponse>

この XML 出力を解析して、すべての利用可能なリージョンに関する ID と LocalName のリストを取得することができます。リクエストの送信時に Format パラメーターとして JSON を指定した場合は、結果も JSON 形式で返されます。