edit-icon download-icon

Callback

最終更新日: Oct 11, 2018

コールバックを実行するには、関連するコールバックパラメータをOSSに送信された要求に添付するだけです。現在コールバックをサポートするAPIには、PutObject、PostObject、CompleteMultipartUploadなどがあります。

コールバックパラメータを構築する

コールバックパラメータは、Base64でエンコードされたJSON文字列で構成されています。要求コールバックサーバーURL(callbackUrl)とコールバックコンテンツ(callbackBody)を指定することが重要です。詳細なJSONフィールドは次のとおりです。

フィールド 意味 必須かどうか
callbackUrl - ファイルが正常にアップロードされると、OSSはこのURLにコールバック要求を送信します。リクエストメソッドはPOSTで、bodyはcallbackBodyに指定されたコンテンツです。通常の状況で、このURLが「HTTP / 1.1 200 OK」に応答する必要がある場合、レスポンス本文はJSON形式でなければならず、レスポンスヘッダーContent-Lengthは有効な値で、3 MBを超えない必要があります。
- この機能を使用すると、ユーザーは「;」で区切られた5つのURLを設定できます。最初の正常な応答が返されるまで、OSSは要求を1つずつ送信します。
- URLが設定されていないか、値がnullの場合、コールバック設定がないとみなされます。
- HTTPSがサポートされています。
- 中国語文字が正しく処理されるようにするには、callbackUrlをエンコードする必要があります。たとえば、http://example.com/Chinese.php?key=value&Chinese Name=Chinese Valuehttp://example.com/%E4%B8%AD%E6%96%87.php?key=value&%E4%B8%AD%E6%96%87%E5%90%8D%E7%A7%B0=%E4%B8%AD%E6%96%87%E5%80%BCのように変換します。
必須
callbackHost - コールバック要求を開始するためのホストヘッダー値。callbackUrlが設定されている場合にのみ有効です。
- callbackHostが設定されていない場合、callbackUrlのURLが解決され、解決後に生成されたホストはcallbackHostに入力されます。
オプション
callbackBody - コールバックが開始されたときのリクエスト本文の値。たとえば、key = $(key)&etag = $(etag)&my_var = $(x:my_var)。
- OSSシステム変数、カスタム変数、および定数をサポートします。サポートされているシステム変数については、以下の表で説明します。カスタム変数は、PutObjectとCompleteMultipartのコールバック-varによる送信によってサポートされています。Post Object操作では、各変数はフォームフィールドを介して送信されます。
必須
callbackBodyType - 開始されたコールバック要求のContent-Type。これは、application/x-www-form-urlencodedとapplication/jsonをサポートし、前者はデフォルト値です。
- Content-Typeがapplication/x-www-form-urlencodedに設定されている場合、callbackBodyの変数はURLエンコードされた値に置き換えられます。Content-Typeがapplication/jsonに設定されている場合、これらの変数はJSON形式に従って置き換えられます。
オプション

JSONの文字列の例は次のとおりです。

  1. {
  2. "callbackUrl":"121.101.166.30/test.php",
  3. "callbackHost":"oss-cn-hangzhou.aliyuncs.com",
  4. "callbackBody":"{\"mimeType\":${mimeType},\"size\":${size}}",
  5. "callbackBodyType":"application/json"
  6. }
  1. {
  2. "callbackUrl":"121.43.113.8:23456/index.html",
  3. "callbackBody":"bucket=${bucket}&object=${object}&etag=${etag}&size=${size}&mimeType=${mimeType}&imageInfo.height=${imageInfo.height}&imageInfo.width=${imageInfo.width}&imageInfo.format=${imageInfo.format}&my_var=${x:my_var}"
  4. }

ここで、callbackBodyに設定できるシステム変数には、次のものがあります。具体的には、imageInfoは画像フォーマット用です。非画像形式の場合は空白のままにしてください。

システム変数 意味
bucket バケット
object オブジェクト
etag ファイルのetag、ユーザーに返されたetagフィールド
size オブジェクトのサイズCompleteMultipartUpload操作中、これはオブジェクト全体のサイズです。
mimeType リソースタイプ。jpegイメージの場合、リソースタイプはimage/jpegです。
imageInfo.height 画像の高さ
imageInfo.width 画像の幅
imageInfo.format jpgやpngなどの画像フォーマット

カスタムパラメータ

callback-varパラメータを使用してカスタムパラメータを構成できます。

カスタムパラメータは、キー値のマップです。マップに必要なパラメータを設定できます。POSTコールバック要求を開始するとき、OSSはこれらのパラメータと上記のセクションで説明したシステムパラメータをPOST要求の本体に入れます。これにより、コールバック受信者がこれらのパラメータを簡単に取得できるようになります。

コールバックパラメータの作成と同じ方法でカスタムパラメータを構築できます。カスタムパラメータは、JSON形式で送信することもできます。JSON文字列は、すべてのカスタムパラメータのキー値を含むマップです。カスタムパラメータのキーは、x:で始まり、小文字にする必要があります。 2つのカスタムパラメータx:var1とx:var2を設定する必要があり、2つのパラメータの値がそれぞれvalue1とvalue2であると仮定すると、構築されるJSON形式は次のようになります。

  1. {
  2. "x:var1":"value1",
  3. "x:var2":"Value2"
  4. }

コールバックリクエストを作成する

callbackおよびcallback-varパラメータが構築された後、3つの方法でパラメータをOSSに送信できます。コールバックパラメータは必須で、callback-varパラメータはオプションです。カスタムパラメータを設定しない場合は、callback-varフィールドを追加する必要はありません。前記3つの方法は以下の通りである。

  • URLにパラメータを含める。
  • ヘッダにパラメータを含める。
  • フォームフィールドを使用して、POST要求の本体にパラメーターを組み込む。 POSTを使用してオブジェクトをアップロードする場合にのみ、このメソッドを使用してコールバックパラメータを指定できます。

3つの方法は別の方法です。それ以外の場合、OSSはInvalidArgumentエラーを返します。

OSS要求にパラメータを含めるには、最初にBase64を使用して上で構築したJSON文字列をエンコードし、以下に説明するメソッドを使用して文字列をOSS要求に含める必要があります。

  • URLにパラメータを含めるには、URLパラメータとして ‘callback = [CallBack]’または ‘callback-var = [CallBackVar]’を使用してリクエストと共に送信します。署名のCanonicalizedResourceが計算されると、callbackまたはcallback-varがサブリソースとして考慮されます。
  • ヘッダにパラメータを含めるには、 ‘x-oss-callback = [CallBack]’または ‘x-oss-callback-var = [CallBackVar]’を頭に使用してリクエストとともに送信します。CanonicalizedOSSHeaders of the signatureが計算されると、x-oss-callback-varとx-oss-callbackが考慮されます。以下に例を示します。
  1. PUT /test.txt HTTP/1.1
  2. Host: callback-test.oss-test.aliyun-inc.com
  3. Accept-ncoding: identity
  4. Content-Length: 5
  5. x-oss-callback-var: eyJ4Om15X3ZhciI6ImZvci1jYWxsYmFjay10ZXN0In0=
  6. User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4)
  7. x-oss-callback: eyJjYWxsYmFja1VybCI6IjEyMS40My4xMTMuODoyMzQ1Ni9pbmRleC5odG1sIiwgICJjYWxsYmFja0JvZHkiOiJidWNrZXQ9JHtidWNrZXR9Jm9iamVjdD0ke29iamVjdH0mZXRhZz0ke2V0YWd9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSZpbWFnZUluZm8uaGVpZ2h0PSR7aW1hZ2VJbmZvLmhlaWdodH0maW1hZ2VJbmZvLndpZHRoPSR7aW1hZ2VJbmZvLndpZHRofSZpbWFnZUluZm8uZm9ybWF0PSR7aW1hZ2VJbmZvLmZvcm1hdH0mbXlfdmFyPSR7eDpteV92YXJ9In0=
  8. Host: callback-test.oss-test.aliyun-inc.com
  9. Expect: 100-Continue
  10. Date: Mon, 14 Sep 2015 12:37:27 GMT
  11. Content-Type: text/plain
  12. Authorization: OSS mlepou3zr4u7b14:5a74vhd4UXpmyuudV14Kaen5cY4=
  13. Test
  • 独立したフォームフィールドを使用してコールバックパラメータを組み込む必要があるため、POSTを使用してオブジェクトをアップロードするときに、コールバックパラメータを含めるのが少し複雑です。以下の例を参照してください。
  1. --9431149156168
  2. Content-Disposition: form-data; name="callback"
  3. eyJjYWxsYmFja1VybCI6IjEwLjEwMS4xNjYuMzA6ODA4My9jYWxsYmFjay5waHAiLCJjYWxsYmFja0hvc3QiOiIxMC4xMDEuMTY2LjMwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JChmaWxlbmFtZSkmdGFibGU9JHt4OnRhYmxlfSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==

カスタムパラメータがある場合、フォームフィールドにcallback-varパラメータを直接含めることはできません。独立したフォームフィールドを使用して各カスタムパラメータを組み込む必要があります。たとえば、カスタムパラメータのJSONが:

  1. {
  2. "x:var1":"value1",
  3. "x:var2":"value2"
  4. }

POSTリクエストのフォームフィールドは、次のようにする必要があります。

  1. --9431149156168
  2. Content-Disposition: form-data; name="callback"
  3. eyJjYWxsYmFja1VybCI6IjEwLjEwMS4xNjYuMzA6ODA4My9jYWxsYmFjay5waHAiLCJjYWxsYmFja0hvc3QiOiIxMC4xMDEuMTY2LjMwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JChmaWxlbmFtZSkmdGFibGU9JHt4OnRhYmxlfSIsImNhbGxiYWNrQm9keVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifQ==
  4. --9431149156168
  5. Content-Disposition: form-data; name="x:var1"
  6. value1
  7. --9431149156168
  8. Content-Disposition: form-data; name="x:var2"
  9. value2

同時に、ポリシーにコールバック条件を追加できます(コールバックが追加されていない場合は、このパラメータでアップロード検証は実行されません)。 例えば:

  1. { "expiration": "2014-12-01T12:00:00.000Z",
  2. "conditions": [
  3. {"bucket": "johnsmith" },
  4. {"callback": "eyJjYWxsYmFja1VybCI6IjEwLjEwMS4xNjYuMzA6ODA4My9jYWxsYmFjay5waHAiLCJjYWxsYmFja0hvc3QiOiIxMC4xMDEuMTY2LjMwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JChmaWxlbmFtZSkiLCJjYWxsYmFja0JvZHlUeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0="},
  5. ["starts-with", "$key", "user/eric/"],
  6. ]
  7. }

コールバック要求を開始する

ファイルが正常にアップロードされた場合、OSSはPOSTメソッドを使用して、コールバックパラメータとユーザーの要求のカスタムパラメータ(callback-varパラメータ)に基づいてアプリケーションサーバーに特定のコンテンツを送信します。

  1. POST /index.html HTTP/1.0
  2. Host: 121.43.113.8
  3. Connection: close
  4. Content-Length: 181
  5. Content-Type: application/x-www-form-urlencoded
  6. User-Agent: ehttp-client/0.0.1
  7. bucket=callback-test&object=test.txt&etag=D8E8FCA2DC0F896FD7CB4CB0031BA249&size=5&mimeType=text%2Fplain&imageInfo.height=&imageInfo.width=&imageInfo.format=&x:var1=for-callback-test

コールバックの結果を返す

たとえば、アプリケーションサーバーは次の応答要求を返します。

  1. HTTP/1.0 200 OK
  2. Server: BaseHTTP/0.3 Python/2.7.6
  3. Date: Mon, 14 Sep 2015 12:37:27 GMT
  4. Content-Type: application/json
  5. Content-Length: 9
  6. {"a":"b"}

アップロード結果を返す

次のコンテンツがクライアントに送信されます。

  1. HTTP/1.1 200 OK
  2. Date: Mon, 14 Sep 2015 12:37:27 GMT
  3. Content-Type: application/json
  4. Content-Length: 9
  5. Connection: keep-alive
  6. ETag: "D8E8FCA2DC0F896FD7CB4CB0031BA249"
  7. Server: AliyunOSS
  8. x-oss-bucket-version: 1442231779
  9. x-oss-request-id: 55F6BF87207FB30F2640C548
  10. {"a":"b"}

CompleteMultipartUploadなどのリクエストの場合、返されたリクエスト本文にはコンテンツが存在することに注意してください(たとえば、XM1形式の情報)。アップロードコールバック関数を使用すると、元の本文の内容が上書きされます(例: “a”: “b” ‘)。これを判断と処理に配慮してください。

コールバック署名

コールバックパラメータが設定されると、OSSは、ユーザーが設定したcallbackUrlに基づいて、POSTコールバック要求をユーザーのアプリケーションサーバーに送信します。コールバック要求を受信した後、アプリケーションサーバがコールバック要求がOSSによって開始されているかどうかを確認する場合は、コールバック要求にシグネチャを含めてOSS IDを確認できます。

署名を生成する

署名はOSS側で発生し、RSA Asymmetric Encryptionを使用して署名されます。次のように秘密鍵を使用して署名を暗号化できます。

  1. authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + \n + body, md5))

説明:private_keyは、OSSにのみ知られている秘密鍵を示します。パスは、コールバック要求のリソースパスを示します。query_stringはクエリ文字列を示します。本文は、コールバックのメッセージ本文を示します。したがって、署名は以下のステップになります。

  • 署名する文字列を取得する:リソースパスのURLがデコードされ、初期クエリ文字列、キャリッジリターン、およびコールバックメッセージ本文によって追加されます。
  • RSA署名:秘密鍵を使用して目的の文字列に署名します。署名のハッシュ関数はMD5です。
  • Base64を使用して、署名付きの結果をエンコードして最終的な署名を取得します。署名をコールバック要求の承認ヘッダーに入れます。

以下に例を示します。

  1. POST /index.php?id=1&index=2 HTTP/1.0
  2. Host: 121.43.113.8
  3. Connection: close
  4. Content-Length: 18
  5. authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==
  6. Content-Type: application/x-www-form-urlencoded
  7. User-Agent: ehttp-client/0.0.1
  8. x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
  9. bucket=yonghu-test

パスは / index.php、query_stringは?id = 1&index = 2であり、本文は bucket = yonghu-testであり、最終的な署名結果はkKQeGTRccDKyHB3H9vF + xYMSrmhMZjzzl2 / kdD1ktNVgbWEfYTQG0G2SU / RaHBovRCE8OkQDjC3uG33esH2txA ==です。

署名を検証する

署名検証は、署名の逆のプロセスです。署名はアプリケーションサーバーによって検証され、プロセスは次のようになります。

  1. Result = rsa_verify(public_key, md5(url_decode(path) + query_string + \n + body), base64_decode(authorization))

フィールドは、署名処理中に記述されたのと同じ意味を持ちます。public_keyは、公開鍵を示します。認可は、コールバックヘッダーの署名を示します。署名の検証は、次の手順で構成されます。

  • コールバック要求のx-oss-pub-key-urlヘッダーには、Base64でエンコードされた公開鍵のURLが格納されます。次のように、ヘッダーをBase64でデコードして公開鍵を取得する必要があります。
  1. public_key = urlopen(base64_decode(Value of the x-oss-pub-key-url header))

x-oss-pub-key-urlヘッダの値はhttp://gosspublic.alicdn.com/https://gosspublic.alicdn.com/で始まらなければならないことに注意してください公開鍵がOSSによって確実に提供されるようにします。

  • Base64でデコードされた署名を取得します。
  1. signature = base64_decode(Value of the authorization header)
  • 署名プロセスで説明したのと同じ方法で、署名する文字列を取得します。
  1. sign_str = url_decode(path) + query_string + \n + body
  • 署名を確認します
  1. result = rsa_verify(public_key, md5(sign_str), signature)

上記のサンプルを例として使用します。

  • 公開鍵のURLを取得します。 aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ ==をBase64http:// gosspublic.alicdn.com / callback_pub_key_v1.pem`で複合化します。
  • 署名ヘッダ kKQeGTRccDKyHB3H9vF + xYMSrmhMZjzzl2 / kdD1ktNVgbWEfYTQG0G2SU / RaHBovRCE8OkQDjC3uG33esH2txA ==は、Base64でデコードされます(デコードされた結果は、表示できない文字列であるため表示できません)。
  • 署名文字列、url_decode( “index.php”)+ “?id = 1&index = 2” + “bucket = yonghu-test”を取得します。次に、MD5チェックを実行します。
  • 署名を確認します。

アプリケーションサーバーの例

Pythonは、アプリケーションサーバーが署名を検証する方法を示すための例として使用されています。この例では、M2Cryptoライブラリをインストールする必要があります。

  1. import httplib
  2. import base64
  3. import md5
  4. import urllib2
  5. from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
  6. from M2Crypto import RSA
  7. from M2Crypto import BIO
  8. def get_local_ip():
  9. try:
  10. csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  11. csock.connect(('8.8.8.8', 80))
  12. (addr, port) = csock.getsockname()
  13. csock.close()
  14. return addr
  15. except socket.error:
  16. return ""
  17. class MyHTTPRequestHandler(BaseHTTPRequestHandler):
  18. '''
  19. def log_message(self, format, *args):
  20. return
  21. '''
  22. def do_POST(self):
  23. #get public key
  24. pub_key_url = ''
  25. try:
  26. pub_key_url_base64 = self.headers['x-oss-pub-key-url']
  27. pub_key_url = pub_key_url_base64.decode('base64')
  28. if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"):
  29. self.send_response(400)
  30. self.end_headers()
  31. return
  32. url_reader = urllib2.urlopen(pub_key_url)
  33. #you can cache it
  34. pub_key = url_reader.read()
  35. except:
  36. print 'pub_key_url : ' + pub_key_url
  37. print 'Get pub key failed!'
  38. self.send_response(400)
  39. self.end_headers()
  40. return
  41. #get authorization
  42. authorization_base64 = self.headers['authorization']
  43. authorization = authorization_base64.decode('base64')
  44. #get callback body
  45. content_length = self.headers['content-length']
  46. callback_body = self.rfile.read(int(content_length))
  47. #compose authorization string
  48. auth_str = ''
  49. pos = self.path.find('?')
  50. if -1 == pos:
  51. auth_str = urllib2.unquote(self.path) + '\n' + callback_body
  52. else:
  53. auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body
  54. print auth_str
  55. #verify authorization
  56. auth_md5 = md5.new(auth_str).digest()
  57. bio = BIO.MemoryBuffer(pub_key)
  58. rsa_pub = RSA.load_pub_key_bio(bio)
  59. try:
  60. result = rsa_pub.verify(auth_md5, authorization, 'md5')
  61. except:
  62. result = False
  63. if not result:
  64. print 'Authorization verify failed!'
  65. print 'Public key : %s' % (pub_key)
  66. print 'Auth string : %s' % (auth_str)
  67. self.send_response(400)
  68. self.end_headers()
  69. return
  70. #do something accoding to callback_body
  71. #response to OSS
  72. resp_body = '{"Status":"OK"}'
  73. self.send_response(200)
  74. self.send_header('Content-Type', 'application/json')
  75. self.send_header('Content-Length', str(len(resp_body)))
  76. self.end_headers()
  77. self.wfile.write(resp_body)
  78. class MyHTTPServer(HTTPServer):
  79. def __init__(self, host, port):
  80. HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler)
  81. if '__main__' == __name__:
  82. server_ip = get_local_ip()
  83. server_port = 23451
  84. server = MyHTTPServer(server_ip, server_port)
  85. server.serve_forever()

他の言語で実装されているアプリケーションサーバーは、次のとおりです。

Javaバージョン:

  • ダウンロードアドレス:ここをクリック
  • 実行方法:パッケージを展開し、 java -jar oss-callback-server-demo.jar 9000を実行します(9000はポート番号で、必要に応じて指定できます)

PHPのバージョン:

  • ダウンロードアドレス:ここをクリック
  • 実行方法:プログラムをApache環境にデプロイします。PHP言語の特徴は、環境がいくつかのヘッダを取得することに依存していることを決定します。この例を参照して、自分の環境を変更することができます。

Pythonバージョン:

  • ダウンロードアドレス:ここをクリック
  • 実行方法:パッケージを展開し、 python callback_app_server.pyを直接実行します。このプログラムを実行するには、RSA依存関係をインストールする必要があります。

C#のバージョン:

  • ダウンロードアドレス:ここをクリック
  • 実行方法:パッケージを解凍し、 README.mdを参照してください。

Goバージョン:

  • ダウンロードアドレス:ここをクリック
  • 実行方法:パッケージを解凍し、 README.mdを参照してください。

Rubyバージョン:

特別な指示

  • 入力コールバックパラメータまたはcallback-varパラメータが無効な場合は、エラーコード “InvalidArgument”とともに400エラーが返されます。無効な状況は次のとおりです。
    • PutObject()およびCompleteMultipartUpload()インタフェースでは、callback(x-oss-callback)またはcallback-var(x-oss-callback-var)パラメータがURLおよびヘッダーフィールドに同時に入力されます。
    • callbackまたはcallback-varパラメータが長すぎます(5KB以上)。PostObject()はcallback-varパラメータがないのでこの制限の対象にはならず、以下の場合も同様です。
    • callbackまたはcallback-varがBase64でエンコードされていない
    • Base64のデコード後、callbackまたはcallback-varパラメータが有効なJSON形式ではありません
    • callbackパラメータの解決後、callbackUrlフィールドに5つ以上のURLが含まれているか、またはURLの入力ポートが無効です(たとえば{" callbackUrl ":" 10.101.166.30:test "、" callbackBody ":" test "})
    • callbackパラメータの解決後、callbackBodyフィールドは空白です。
    • callbackパラメータの解決後、callbackBodyTypeフィールドの値は、 “application/x-www-form-urlencoded”または “application/json”です。
    • callback-varパラメータの解決後、callbackBodyフィールドには無効な形式の変数が含まれています。有効な形式は $ {var}です。
    • callback-varパラメータ解決後、フォーマットは期待されるJSONフォーマットではありません。予想される形式は次のとおりです。{" x:var1 ":" value1 "、" x:var2 ":" value2 "...}
  • callback失敗すると、システムは203エラーを返し、エラーコード “CallbackFailed”を返します。コールバックの失敗は、アプリケーションサーバーがコールバック要求を受信していないことを意味するのではなく、OSSが予期されるコールバック応答を受信しなかったことを示します(たとえば、アプリケーションサーバーからの応答はJSON形式ではありません)。さらに、この時点までに、ファイルは正常にOSSにアップロードされています。

  • アプリケーションサーバーからOSSに返される応答には、Content-Lengthヘッダーが含まれていなければならず、本文のサイズは1 MBを超えることはできません。

コールバックで使用されるリージョン

現在、コールバックは下記のリージョンだけサポートされています。中国北2(北京)、中国東1(杭州)、中国北1(青島)、中国東2(上海)、上海金融雲、中国南1 、中国北5(huhehaote)、中国北3(zhangjiakou)、中東1(Dubai)、アジア太平洋NE 1(東京)、EU Central 1(フランクフルト)、アジア太平洋SE 1(シンガポール)、US East 1 )、米国西1(シリコンバレー)、アジア太平洋SE 2(シドニー)、アジア太平洋SE 3(クアラルンプール)