Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

インフラエンジニアなら『さくらのクラウド』をAPIでいじろう【入門編】

2,462 views

Published on

公開準備中
インフラエンジニアなら『さくらのクラウド』をAPIでいじろう【入門編】
初めての人のためのAPI入門 APIをコマンドラインで触ってみよう
さくらインターネット エバンジェリスト 寺尾英作
OSC 北海道 2016
2016年6月18日

Published in: Internet
  • Be the first to comment

インフラエンジニアなら『さくらのクラウド』をAPIでいじろう【入門編】

  1. 1. (C)Copyright 1996-2016 SAKURA Internet Inc. 【入門編】 インフラエンジニアなら「さくらのクラウド」をAPIでいじろう 初めての人のためAPI入門! APIをコマンドラインで触ってみよう 2016年3月3日 さくらインターネット株式会社 エバンジェリスト 寺尾 英作
  2. 2. 今日は・・・ • 諸般の事情でCLIが不調のため • APIをコマンドラインから叩く方法をご説明しま す • 今日帰ってすぐ使えるコマンドをご紹介します。
  3. 3. http://bit.ly/1tzFx8z 今日の資料ダウンロードはこちら 画面が見にくい場合は、スマホなどで 拡大して見てください http://www.slideshare.net/eisakuterao/20160619-sakuracloudap-iatoscdo
  4. 4. 会社概要 東京支社外観 商 号 さくらインターネット株式会社 (東証一部:3778) 大阪本社 東京支社 大阪市中央区南本町1-8-14 堺筋本町ビル9F 東京都新宿区西新宿7-20-1 住友不動産西新宿ビル33F 設 立 1999年8月17日 (サービス開始: 1996年12月23日) 資 本 金 8億9,530万円 売上高 105億7,600万円(2015年3月期) 事業内容 インターネットでのサーバの設置及びその管理業務 電気通信事業法に基づく電気通信事業 従業員数 266名(2015年3月末現在) 所属団体 社団法人日本ネットワークインフォメーションセンター 会員(JPNIC) 特定非営利活動法人日本データセンター協会 会員(JDCC) 社団法人インターネットプロバイダー協会 会員(JAIPA) グリーン・グリッド(The Green Grid) IPv6普及・高度化推進協議会 会員 ASP・SaaSインダストリ・コンソーシアム 会員 など 4
  5. 5. データセンターの概要 業界トレンドと幅広い利用者からのニーズを反映したデータセンター 様々なサービスが集約できる 国内最大級の拡張性を持つ郊外型データセンター 郊外型データセンター オフィス至近、豊富な配信実績を持つ 都市型データセンター 都市型データセンター 石狩 東京 大阪 ●用途 ホスティング、VPS、クラウド、ハウジング ●総ラック数 2,700基(2015年4月現在) ●顧客数 約360,000件(2015年4月現在) 5
  6. 6. データセンターへの入局や機 器の設置といった物理作業の すべてを代行するサービス サービスラインアップ ハウジング サービス 会員制サイト、キャンペーンサイト エンタープライズ インターネットメール、Webサイト運営 ネットビジネス、電子商取引、動画・音楽配信 専用サーバ Platform St 専用サーバ Platform Ad レンタルサーバ サービス ハウジング 専用サーバ サービス さくらの マネージド サーバ さくらの レンタル サーバ 1台を共有1台を専有 1台 ~ 複数台 ・サービスの主な利用用途 仮想サーバ サービス さくらのVPS 仮想化技術を用 いて、1台の物 理サーバ上に複 数の仮想サーバ を構築し、仮想 専用サーバとし て利用するサー ビス クラウド サービス 高性能サーバと拡張 性の高いネットワー クを圧倒的なコスト パフォーマンスで実 現 SNS、Webアプリケーション、SaaS、ASP リモートハウジング ※石狩データセンターで提供 6
  7. 7. 7 クラウド
  8. 8. クラウドとは “クラウドとはコンピュータ資源を必要なとき必要 なだけ簡単に使える仕組み” 8 クラウドコンピューティングとは、ネットワーク、サーバ、ストレージ、アプリ ケーション、サービスなどの構成可能なコンピューティングリソースの共用プール に対して、便利かつオンデマンドにアクセスでき、最小の管理労力またはサービス プロバイダ間の相互動作によって迅速に提供され利用できるという、モデルのひと つである(NISTの定義) アメリカ国立標準技術研究所
  9. 9. さくらのクラウドの説明 ブラウザだけで「仮想データセンター」を操作 ブラウザから、サーバ・スイッチなど「仮想データセンター」を操作 物理サーバとも接続できる コストパフォーマンスが高い物理サーバとも接続 料金プランは1つ、自動的に最安値にセット 利用開始から20日未満は日割り、20日の時点で月額料金が適用
  10. 10. さくらのクラウドの説明 • サーバの作成 • サーバのプラン変更(スケールアップ/ダウン) • クローン(サーバの複製) • NICの追加(10個) • DNS逆引きレコード設定 • ロードバランサ(通常/ハイスペック) • ディスクの作成・追加 • アーカイブ(スナップショット)の作成 • パケットフィルタの作成 • 仮想スイッチの作成 一般的な「クラウド(=IaaS)」で 「できる事」はほぼできます。
  11. 11. データセンターをブラウザからセッティング 11 ブラウザからまるでデータセンターにいるように、サーバや スイッチのセットアップが可能です
  12. 12. 「物理データセンター」とも接続できる 12 ハイブリッド接続を利用すれば「物理データセンター」であ る「さくらの専用サーバ」や「リモートハウジング」さらに 「ハウジング」とも接続可能
  13. 13. その他の特徴 13 日本法 VLANで仮想ネットワーク ロケーションの公開 当社のデータセンターは石狩と東京とおおまかなロケーショ ンを公開しております (当たり前ですが)当社のクラウドは日本法が適用されます セキュリティグループではなく、VLANで仮想ネットワーク を構築できます。
  14. 14. イベントログ 14 コントロールパネルやAPIからリソースの作成・削除・ 起動・停止、設定変更などを行った操作を記録し利用者自身 が確認できるようになる機能です
  15. 15. テストゾーン(Sandbox) 15 テスト用ゾーン「Sandboxゾーン」では、無償でAPI動作確 認が可能です。APIを使用して自動操作するなどの独自スク リプトの動作確認用に最適です。
  16. 16. こんな悩みがあるでしょうか ・受注のたびに同じ手順で作業してるけど、 この手順を自動化したい ・何かをトリガーにして自動で再起動したい ・コンパネでは作業手順を書いたり、作業ロ グを取るのが難しい ・さくらからの請求を元にお客さんに 請求書を出したい ・請求内容の分析がしたい クラウドAPI 請求関連API 解決できます!
  17. 17. さくらのクラウドを操作する4つの方法 ・さくらのクラウド API クライアントライブラリ saklient ・コマンドライン操作ツール node-sacloud ・さくらのクラウド API ・さくらのクラウド コントロールパネル API sacloud CLI コンパネ saklient +独自スクリプト #!/bin/bash さくらの クラウド 4つの操作方法
  18. 18. コマンドライン操作ツール node-sacloud (sacloud CLI) https://github.com/sakura-internet/node-sacloud/ (更新停滞中)
  19. 19. さくらのクラウドクライアントライブラリ saklient http://sakura-internet.github.io/saklient.doc/
  20. 20. さくらのクラウド API 1.1 http://developer.sakura.ad.jp/cloud/api/1.1/
  21. 21. REST と JSON API を使うにはREST とJSONは避けて通れません REST (Representational State Transfer )とは Webアーキテクチャスタイル(設計思想)の一つ。 同じURLやパラメータの組み合わせ時には、常に同じ結果が返されること が期待される。 システムの状態やセッションに依存しない。 RESTに準拠したインタフェースのことをRESTful API と呼びます。 さくらのクラウドのAPIもRESTful APIです
  22. 22. JSON JSON(ジェイソン、JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文は JavaScriptにおけるオブジェクトの表記法をベースとしているが、JSONはJavaScript専用のデータ形 式では決してなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しに使える よう設計されている。 表記方法 JSONで表現するデータ型は以下の通りで、これらを組み合わせてデータを記述する。true, false, null などは全て小文字でなくてはならない。 • 数値(整数、浮動小数点数) • 文字列(バックスラッシュによるエスケープシーケンス記法を含む、ダブルクォーテーションでく くった文字列) • 真偽値(trueとfalse) • 配列(データのシーケンス) • オブジェクト(順序づけされていないキーと値のペアの集まり。JSONでは連想配列と等価) • null 数値は10進法表記に限り、8進、16進法表記などはできない。また浮動小数点数としては1.0e-10と いった指数表記もできる。 文字列は(JSONそれ自体と同じく)Unicode文字列である。基本的にはJavaScriptの文字列リテラルと 同様だが、囲むのにシングルクォートは使えない。バックスラッシュによるエスケープがある。 Wikipediaより引用 https://ja.wikipedia.org/wiki/JavaScript_Object_Notation
  23. 23. JSON(2) 配列はゼロ個以上の値をコンマで区切って、角かっこでくくることで表現する。例えば以下のように表 現する: ["milk", "bread", "eggs"] オブジェクトはキーと値のペアをコロンで対にして、これらの対をコンマで区切ってゼロ個以上列挙し、 全体を波かっこでくくることで表現する。例えば以下のように表現する: {"name": "John Smith", "age": 33} ここで注意することはキーとして使うデータ型は文字列に限ることである。したがって、 {name: "John Smith", age: 33} という表記は許されない。この後者の表記はJavaScriptのオブジェクトの表記法としては正しいが、 JSONとしては不正な表記である。 エンコーディング JSONテキストはUnicodeでエンコードするとされている (SHALL)。デフォルトのエンコーディングは UTF-8である。 Wikipediaより引用 https://ja.wikipedia.org/wiki/JavaScript_Object_Notation { "Total": 検索条件にマッチする全レコード数: int, "From": 取得された最初のレコードのオフセット: int, "Count": 取得されたレコード数: int, "リソース名": [ "リソース情報": object, "リソース情報": object, ... ] }
  24. 24. さくらのクラウド API 基礎知識
  25. 25. さくらのクラウド API 1.1 http://developer.sakura.ad.jp/cloud/api/1.1/ API URL(エンドポイントのベースURL) https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1/ (東京第1ゾーン) https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/ (石狩第1ゾーン) https://secure.sakura.ad.jp/cloud/zone/is1b/api/cloud/1.1/ (石狩第2ゾーン) https://secure.sakura.ad.jp/cloud/zone/tk1v/api/cloud/1.1/ (Sandbox) エンドポイントのURL ベースURL パス https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1 /server ゾーン バージョン
  26. 26. 今日のレシピ • APIを使えるようにする • 共通仕様説明(つまらないです) • サーバの操作 1. サーバプラン取得 2. ディスクの作成 3. サーバとディスクの接続 4. ディスクの修正 5. 電源投入 / 電源OFF 6. サーバ一覧 • シンプル監視設定 • オートスケーリング – スクリプトの紹介 • 料金の確認 – プライスリストの確認 – 料金の確認
  27. 27. さくらのクラウド API を使えるようにする
  28. 28. アカウント管理の概要 会員ID アカウントA アカウントB ユーザA ユーザB ┗APIキーA1 ┗APIキーA2 ┗APIキーB1 • API キーはアカウントに紐付きます。 • アカウントに対して、複数のAPIキーが作成できます • APIキーにアクセスレベル・アクセス権を設定することが出来ます。 アクセスレベル:無効<リソース閲覧<電源操作<設定編集<作成・削除 アクセス権:請求情報(リソース閲覧以上のアクセスレベルが必要です) • APIキーはユーザー権限でも作成することは可能ですが、当該ユーザが当該アカウント に対するアクセスレベルを超えるAPIキーの作成は出来ません。
  29. 29. コンパネでAPIキーを作成する(1) APIキーは、さくらのクラウドコンパネで作成します。利用するアカウントを選択し、 さくらのクラウドの「IaaS」にアクセスし、上のメニューにある「設定」をクリックし ます。
  30. 30. コンパネでAPIキーを作成する(2) 左のメニューにある「APIキー」をクリックします。
  31. 31. コンパネでAPIキーを作成する(3) 上のメニューにある「+追加」をクリックします。
  32. 32. コンパネでAPIキーを作成する(4) APIキーの詳細を入力します。入力が終わったら[追加]をクリックします。
  33. 33. コンパネでAPIキーを作成する(5) 作成が完了しているかを確認します。 詳細を確認するには、該当行をダブルクリックします。
  34. 34. コンパネでAPIキーを作成する(6) アクセストークンと、アクセストークンシークレットをメモします。 アクセスレベルやアクセス権が正しいことを確認します。以上で作成完了です。 この例ではリソースの閲覧と請求情報への アクセスが許可されています。
  35. 35. 簡易リクエスト方法 メソッドは GET / POST / PUT / DELETE の4種類あります。 GET 情報の取得 POST リソースの登録・作成 PUT リソースの部分登録・変更 DELETE リソースの削除
  36. 36. 簡易リクエスト方法 パラメータやデータが無い例 サーバの検索・一覧を取得するには、以下のようなURLパスにリクエストを送ります。説明では ベースURLを省略をして記載します。 GET /product/server curl --user "Access_Token":"Access_Token_Secret" -X GET ¥ https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/product/server ¥ | jq . | more ↓これを、curlで実行するためには以下のようなコマンドでアクセスをします。 アクセストークンとシークレットをコロン区切って指定。 作成した物に置換してください APIベースURL(リージョン指定) API パス メソッド
  37. 37. 簡易リクエスト方法 メソッドの指定と、URLパラメータの指定がある例 「リソースの解放」インタフェースを持つAPIが返すレスポンスは、以下のようなオブジェクト 構造を持ちます。 PUT /server/:serverid/power curl --user "Access_Token":"Access_Token_Secret" -X PUT -d '' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:serverid/power ↓ メソッド URLパラメータ(変数) : (コロン)+パラメータ名で記載します
  38. 38. 簡易リクエスト方法 リクエストデータがある例 以下の例は、:serverid に対して、サーバ名を変更するためのリクエストです。データはJSON 形式で送信します。 PUT /server/:serverid { "Server":{ "Name":"New Server Update” } } curl --user "Access_Token":"Access_Token_Secret" -X PUT -d '{"Server":{"Name":"New Server Update"}}' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/:se rverid ↓ 送信データ curlでは-dの後に送信データ を指定します
  39. 39. さくらのクラウド API 共通仕様
  40. 40. サーバを作成する • その前に 2xx系 成功 3xx系 情報 4xx系 一時的失敗 5xx系 失敗 ステータスコード 内容 200 OK 正常に処理され、何らかのレスポンスが返却さ れた。 201 Created 正常に処理され、何らかのリソースが作成され た。 例:仮想サーバを作成した 202 Accepted 正常に受け付けられたが、処理は完了していな い。 例:ディスクの複製を開始したが、まだ完了し ていない 204 No Content 正常に処理され、空のレスポンスが返却された。 ステータスコード 内容 305 Use Proxy Locationフィールドに示されたプロクシ経由 でのアクセスが必要。 ステータスコード 内容 500 Internal Server Error 内部エラーが発生した。 例:PHPエラーが発生した。 503 Service Unavailable 何らかの事情によりサービスが利用可能 でない。 例:DB接続に失敗した 次ページ参照
  41. 41. サーバを作成する 4xx系 成功 ステータスコード 内容 400 Bad Request リクエストパラメータが不正等。 例:許可されないフィールドに対し、負の値、過去の日付、異なる型の値等が指定されている 401 Unauthorized 認証に失敗した。 403 Forbidden リソースへのアクセス権限がない。 例:/user/sakurai というリソースの上位にある /user にアクセスしたが、このリソースは一般 ユーザにはアクセスできない。 404 Not Found リソースが存在しない。 例:taroというユーザはいないのに /user/taro というリソースにアクセスした。 405 Method Not Allowed 要求されたメソッドは非対応。 例:/zone/5 というリソースにPUTメソッドは許可されていない。 406 Not Acceptable 何らかの事情でリクエストを受け入れられない。 例:残りの空きリソースがない 408 Request Time-out リクエストがタイムアウトした。 409 Conflict リソースの現在の状態と矛盾する操作を行おうとした。 例:仮想サーバの電源が既に入っているのに、電源を投入しようとした。 411 Length Required リクエストヘッダーにLengthが含まれていない。curlコマンドの場合、curl -d ''で回避できる。 413 Request Entity Too Large リクエストされた処理にかかる負荷が対応可能な範囲を越えた。 例:アップロードファイルのサイズ制限を越えた 415 Unsupported Media Type リクエストされたフォーマットに対応していない。 例:画像データを返すリソースに対し、CSVフォーマットを要求した。
  42. 42. 共通インタフェース • 「リソースの検索」共通インタフェース • レスポンスの共通仕様 • リクエストパラメータの共通仕様 • ページング / ソート / フィルタリング / 取得キーを除外 / 取得キーの選択 • 各オプション指定時の挙動 • リソース取得(GET) • レスポンスの共通仕様 • リクエストパラメータの共通仕様 • 取得キーについて • リソース登録(POST) • レスポンスの共通仕様 • リクエストパラメータの共通仕様 • 返却件数の指定 /返却件数の排除 • リソース設定(PUT) • レスポンスの共通仕様 • リクエストパラメータの共通仕様 • リソース解放(DELETE) • レスポンスの共通仕様 • リクエストパラメータの共通仕様
  43. 43. 「リソースの検索」共通インタフェース レスポンスの共通仕様 「リソースの検索」インタフェースを持つAPIが返すレスポンスは、以下のようなオブジェクト 構造を持ちます。 { "Total": 検索条件にマッチする全レコード数: int, "From": 取得された最初のレコードのオフセット: int, "Count": 取得されたレコード数: int, "リソース名": [ "リソース情報": object, "リソース情報": object, ... ] } 各リソース情報は、原則として0から始まる通し番号 および リソースIDを表すフィールドを持 ちます。例えば GET /server を取得した結果、全300件中の101~150件目が返された場合は、 以下のようなレスポンスになります。
  44. 44. 「リソースの検索」共通インタフェース { "Total": 300, "From": 100, /* 0から始まる通し番号 */ "Count": 50, "Servers": [ /* 原則としてリソース名の複数形 */ { "Index": 100, /* 0から始まる通し番号 */ "ID": xxxxxxxxxxxx, /* サーバID */ ... }, { "Index": 101, "ID": yyyyyyyyyyyy, ... }, ... { "Index": 150, "ID": zzzzzzzzzzzz, ... } ] }
  45. 45. 「リソースの検索」共通インタフェース リクエストパラメータの共通仕様 ページング 検索結果のリソース数が膨大になるとAPIの反応が遅くなるため、取得範囲を限定してページン グすることを推奨します。 例えば GET /server の101~150件目を取得する場合は、以下のよ うなパラメータを指定します。 GET /cloud/1.1/server { "From": 100, /* 0から始まる通し番号 */ "Count": 50 } なお、大半のAPIリソースはLimitに一定の上限値が設けられており、省略時もその上限までの レコード数しか取得できません。上限値はリソースにより異なる場合があります。
  46. 46. 「リソースの検索」共通インタフェース リクエストパラメータの共通仕様 ソート ソートキーを文字列の配列で列挙することで、ソートすることができます。 単一キーを指定す る場合は、単一文字列で指定ができます。 GET /cloud/1.1/server { "Sort": [ // 優先順に通常配列で指定 "Server.Name", // 昇順 "-Host.Zone.Name" // 先頭にマイナスを付けると降順 ] }
  47. 47. 「リソースの検索」共通インタフェース リクエストパラメータの共通仕様 フィルタリング • 文字列型カラムは中間一致、その他の型は完全一致のみ対応しています。 • スカラ値を与えると部分一致のAND結合、配列を与えると完全一致のOR結合と見なされま す。 • 大文字・小文字は区別されません。 • 複数の条件はAND結合されます。 GET /cloud/1.1/server { "Filter": { "Name": "test example", // Name に test と example を両方含みます "Zone.Name": [ "is1a", "is1b" ], // Zone.Name が is1a または is1b に完全一致 "CreatedAt <": "2011-09-01T00:00:00+0900” // 作成日時がこの時刻より前(演算子は時刻・数値カラムのみ使用可) // (これらをすべて満たすレコードが抽出されます) } }
  48. 48. 「リソースの検索」共通インタフェース リクエストパラメータの共通仕様 取得キーを除外 通信量やクライアントのメモリを節約したい場合、取得情報を指定し除外できます。 • 不要なキーの配列をExcludeオプションに指定すると、マッチする要素がレスポンスから取 り除かれます。 • *(アスタリスク)を用いてワイルドカード指定することができます。 GET /cloud/1.1/servers { "Exclude": [ "Zone.Name", "Interfaces.*" ] } 各オプション指定時の挙動 Excludeのみ指定時 Exclude指定されたものを除く、取得可能なすべてのキーを取得 Includeのみ指定時 Include指定されたキーのみ取得 Include, Excludeともに指定時 Includeのみ指定時の取得キーから、Exclude指定されたキーを除いて取得
  49. 49. 「リソースの検索」共通インタフェース リクエストパラメータの共通仕様 取得キーの選択 必要なキーの配列をIncludeオプションに指定すると、マッチする要素以外はレスポンスから取 り除かれます。 *(アスタリスク)を用いてワイルドカード指定することができます。 GET /cloud/1.1/servers { "Include": [ "Name", "Status.*", "Zone.ID", "Region.*" ] }
  50. 50. リソース解放(GET) レスポンスの共通仕様 「リソースの取得」インタフェースを持つAPIが返すレスポンスは、以下のようなオブジェクト 構造を持ちます。 { "is_ok": 処理結果, /* boolean (true|false) */ "リソース名": リソース情報, /* object */ } //原則として、API処理の実行結果はis_ok = true で、判定ができます。 { "is_ok":true, "Server": { /* 原則としてリソース名 */ "ID": xxxxxxxxxxxx, /* サーバID */ ... } }
  51. 51. リソース解放(GET) リクエストパラメータの共通仕様 取得キーについて 取得キーが指定(限定)できます。「リソースの検索」共通インタフェースのリクエストパラメー タの取得キーを除外と取得キーの選択を参照してください。
  52. 52. リソース登録(POST) レスポンスの共通仕様 「リソースの取得」インタフェースを持つAPIが返すレスポンスは、以下のようなオブジェクト 構造を持ちます。 { "is_ok": 処理結果, /* boolean (true|false) */ } { "is_ok": true, "Token": "GLSzcpLRFnqmq0AqxxxDUpdIXhTzyZ1s” "Account": { /* 原則としてリソース名 */ "ID": xxxxxxxxxxxx, /* Account ID */ ... }, "CreatedAt": "2012-09-06T12:21:16+09:00", "ExpiresAt": "2012-09-06T14:21:16+09:00" } 原則として、API処理の実行結果はis_ok = true で判定ができます。
  53. 53. リソース登録(POST) リクエストパラメータの共通仕様 返却件数の指定 基本的に、リクエストパラメータは、個々のAPIに依存します。 返却件数の排除 Limit 件数でページングされることを防ぎます。 GET /cloud/1.1/public/account/123456789012/token { "From": 0, "Count": 0, ... }
  54. 54. リソース設定(PUT) レスポンスの共通仕様 「リソースの設定」インタフェースを持つAPIが返すレスポンスは、以下のようなオブジェクト構造を持ちま す。 { "Success": 処理結果, /* boolean (true|false) */ } { "Success": true, } 原則として、API処理の実行結果はSuccess = true で、判定ができます。
  55. 55. リソース解放(DELETE) レスポンスの共通仕様 「リソースの解放」インタフェースを持つAPIが返すレスポンスは、以下のようなオブジェクト 構造を持ちます。 { "Success": 処理結果, /* boolean (true|false) */ "is_ok": API 共通処理結果 /* boolean (true|false) */ } { "Success": true, "is_ok": true } 原則として、API処理の実行結果はSuccess = true で、判定ができます。 認証やAPI の構文な ど、技術的な例外が発生したときは、 is_ok = false となります。
  56. 56. 今日のレシピ • APIを使えるようにする • 共通仕様(つまらなかったですよね) • サーバの作成 1. サーバ作成 2. ディスクの作成 3. サーバとディスクの接続 4. ディスクの修正 5. 電源ON 6. サーバ一覧 • シンプル監視設定 • 請求の確認 – 料金一覧表の確認 – 過去の請求の確認 • オートスケーリング – スクリプトの紹介
  57. 57. サーバ作成
  58. 58. サーバ作成の流れ サーバ作成 サーバプラン 指定 ディスク作成 サーバと接続 ディスクプラン を指定 パブリックアー カイブを指定 サーバ起動 サーバ検索ディスク修正 サーバ作成の流れ→ 必要な情報の収集 ServerID DiskID ArchiveID DiskPlanID ServerPlanID これからの説明では、 curl と jq を多用します。 jqの使い方次第で、コマンドラインでの可能性が 広がります。
  59. 59. サーバプランの確認 GET /product/server | jq . | more レスポンス { "is_ok": true, "ServerPlans": [ { "Availability": "available", "ServiceClass": "cloud/plan/1core-1gb", "MemoryMB": 1024, "CPU": 1, "Description": "", "Name": "プラン/1Core-1GB", "ID": 1001, "Index": 0 }, .... サーバの作成をするには、まずサーバプランを指定する必要があります。 こんな感じで取得できるのですが、たくさんプランが出てくるので見にくいです。
  60. 60. サーバプランの取得 GET /product/server?Sort=CPU | jq -c ".ServerPlans[] | {Availability, ID, ServiceClass,ServiceClass,CPU,MemoryMB}" {"MemoryMB":1024,"CPU":1,"ServiceClass":"cloud/plan/1core-1gb","ID":1001,"Availability":"available"} {"MemoryMB":2048,"CPU":1,"ServiceClass":"cloud/plan/1core-2gb","ID":2001,"Availability":"available"} {"MemoryMB":3072,"CPU":1,"ServiceClass":"cloud/plan/1core-3gb","ID":3001,"Availability":"available"} {"MemoryMB":4096,"CPU":1,"ServiceClass":"cloud/plan/1core-4gb","ID":4001,"Availability":"available"} {"MemoryMB":5120,"CPU":1,"ServiceClass":"cloud/plan/1core-5gb","ID":5001,"Availability":"available"} {"MemoryMB":2048,"CPU":2,"ServiceClass":"cloud/plan/2core-2gb","ID":2002,"Availability":"available"} {"MemoryMB":3072,"CPU":2,"ServiceClass":"cloud/plan/2core-3gb","ID":3002,"Availability":"available"} … GETのリクエストストリングで指定する場合、 JSON形式と、URL形式(a=a&B-b)の2つの方法が 選べます。URL形式の方が楽ちんです。 • SortやFlterでキーを指定する場合は、トップレベルのキー(ここでは`ServerPlans`)は不要です • jq –c を指定すると出力がコンパクトにまとまります。 値を絞り込んで出力したい場合、以下の ように、jq でキーを列挙することで指定 のキーのみを取り出すことが出来ます。
  61. 61. サーバ作成 POST /cloud/1.1/server リクエスト { "Count": 0, "Server": { "WaitDiskMigration": true, "Icon": null, "Tags": [ "@virtio-net-pci", "apitest" ], "Description": ”apitest", "Name": "ServerAPI03", "ConnectedSwitches": [ { "virtio": true, "BandWidthMbps": 100, "Scope": "shared", "_operation": "internet" } ], "ServerPlan": { "ID": 1001 } } } ServerPlanを確認する必要があります インターネット接続は 100Mbps 共有ベストエフォート インターネット接続は 100Mbps 共有ベストエフォート
  62. 62. サーバ作成 curl --user "Access_Token":"Access_Token_Secret" -X POST -d '{"Server":{"ServerPlan":{"ID":1001},"ConnectedSwitches":[{"_operation":"internet","Scope":"sh ared","BandWidthMbps":100,"virtio":true}],"Name":"ServerAPI03","Description":"apitest","Tags ":["@virtio-net-pci","apitest"],"Icon":null,"WaitDiskMigration":true},"Count":0}' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server | jq . リクエスト ようやく、サーバ作成が出来ます。 リクエストデータをcurlの –d オプションで指定します。 シングルクオーテーションで全体を囲みます。(JSONに ダブルクオーテーションが多いので)
  63. 63. サーバ作成 { "is_ok": true, "Success": true, "Server": { "Interfaces": [ { "Subnet": { "DefaultRoute": "133.242.70.1", "NetworkMaskLen": 24, "NetworkAddress": "133.242.70.0", "ID": null }, }, "IPAddress": "133.242.70.90", } ], "ID": "112800580022", "Name": "ServerAPI03", "HostName": "localhost", "Description": "test", "Availability": "migrating", "ServiceClass": "cloud/plan/1core-1gb", } } レスポンス(抜粋) ネットワーク情報 割り当てられたIPアドレス サーバのリソースID(サーバID)
  64. 64. サーバの検索 /server?Filter=Servers.Tags:apitest | jq -c ".Servers[] | {ID, Name, HostName, IPAddress : .Interfaces[].IPAddress , Status : .Instance.Status } " サーバが出来たかを確認しましょう。 {"Status":"down","IPAddress":"133.242.19.104","HostName":"localhost","Name":"ServerAPI01 ","ID":"112800578058"} {"Status":"down","IPAddress":"133.242.22.14","HostName":"localhost","Name":"ServerAPI01" ,"ID":"112800578062"} {"Status":"up","IPAddress":"133.242.49.106","HostName":"localhost","Name":"plesk02","ID" :"112800528996"} リクエスト レスポンス
  65. 65. アーカイブの一覧の取得 GET /archive?Filter="Scope":"shared"&Sort=Name' | jq -c ".Archives[] | {ID,Name,Scope,SizeMB}" アーカイブの一覧を取得します。 パブリックアーカイブがインストールの元となるアーカイブです。 {"SizeMB":20480,"Scope":"shared","Name":"CentOS 5.11 64bit","ID":"112800291714"} {"SizeMB":102400,"Scope":"shared","Name":"CentOS 5.11 64bit","ID":"112800291715"} {"SizeMB":20480,"Scope":"shared","Name":"CentOS 6.7 64bit","ID":"112800239057"} {"SizeMB":20480,"Scope":"shared","Name":"CentOS 7.2 64bit","ID":"112800239060"} {"SizeMB":20480,"Scope":"shared","Name":"CoreOS 367.1.0 (stable)","ID":"112600559834"} {"SizeMB":20480,"Scope":"shared","Name":"Debian GNU/Linux 7.10.0 64bit","ID":"112800438502"} {"SizeMB":20480,"Scope":"shared","Name":"Debian GNU/Linux 8.4.0 64bit","ID":"112800438543"} ...... リクエスト レスポンス パブリックアーカイブは、 Scopeが"shared" となっています
  66. 66. ディスクプランの取得 curl --user "Access_Token":"Access_Token_Secret" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/product/disk | jq -c ".DiskPlans[] | {ID,Name, SizeMB : .Size[].SizeMB}" {"SizeMB":20480,"Name":"SSDプラン","ID":4} {"SizeMB":102400,"Name":"SSDプラン","ID":4} {"SizeMB":256000,"Name":"SSDプラン","ID":4} {"SizeMB":512000,"Name":"SSDプラン","ID":4} {"SizeMB":40960,"Name":"標準プラン","ID":2} {"SizeMB":61440,"Name":"標準プラン","ID":2} {"SizeMB":81920,"Name":"標準プラン","ID":2} {"SizeMB":102400,"Name":"標準プラン","ID":2} {"SizeMB":256000,"Name":"標準プラン","ID":2} {"SizeMB":512000,"Name":"標準プラン","ID":2} {"SizeMB":768000,"Name":"標準プラン","ID":2} {"SizeMB":1048576,"Name":"標準プラン","ID":2} {"SizeMB":2097152,"Name":"標準プラン","ID":2} {"SizeMB":4194304,"Name":"標準プラン","ID":2} レスポンス リクエスト
  67. 67. ディスクの作成とサーバとの接続 POST /cloud/1.1/disk { "Count": 0, "Disk": { "Server": { "ID": "112800580022" }, "Name": "ServerAPI03", "Connection": "virtio", "SizeMB": 20480, "SourceArchive": { "ID": "112800239060" }, "Plan": { "ID": 4 } } } リクエスト 接続するサーバと同じ 先ほど作成したサーバの リソースID(サーバID)を指定。ディスク作成後 直ぐに接続する。 ディスクプランで取得したIDを指定 HDD:2 / SSD:4 ディスクプランで取得したディスクサイズ を数値で指定 アーカイブ一覧で取得したパブリックアーカイ ブ(OS)のIDを指定
  68. 68. ディスクの作成とサーバとの接続 curl --user "Access_Token":"Access_Token_Secret" -X POST –d '{"Disk":{"Plan":{"ID":4},"SourceArchive":{"ID":"112800239060"},"SizeMB":20480 ,"Connection":"virtio","Name":"ServerAPI03","Server":{"ID":"112800580022"}},"C ount":0}' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/disk | jq . { "is_ok": true, "Success": "Accepted", "Disk": { "SizeMB": 20480, "Name": "ServerAPI03", "ID": "112800580030" } } レスポンス(抜粋) リクエストコマンド 作成したディスクのID
  69. 69. ディスクの修正 PUT cloud/1.1/disk/112800579885/config { "Count": 0, "HostName": "ServerAPI03", "Password": "124YJNLu" } リクエスト サーバのホスト名を書き込み root パスワードを書き込み 作成したディスクのID curl --user "Access_Token":"Access_Token_Secret" -X PUT -d '{"Password":"124YJNLu","HostName":"ServerAPI03","Count":0}' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/disk/112800580030/co nfig | jq . リクエストコマンド { "is_ok": true, "Success": true } レスポンス
  70. 70. サーバを起動する PUT cloud/1.1/server/112800580022/power リクエスト 作成したサーバのID curl --user "Access_Token":"Access_Token_Secret" -X PUT -d '' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/112800580022/ power | jq . リクエストコマンド { "is_ok": true, "Success": true } レスポンス
  71. 71. サーバの検索 /server?Filter=Servers.Tags:apitest | jq -c ".Servers[] | {ID, Name, HostName, IPAddress : .Interfaces[].IPAddress , Status : .Instance.Status } " サーバが出来たかを確認しましょう。 {"Status":"down","IPAddress":"192.168.xx.104","HostName":"localhost","Name":"ServerAPI01 ","ID":"112800578058"} {"Status":"down","IPAddress":"192.168.x.14","HostName":"localhost","Name":"ServerAPI01", "ID":"112800578062"} {"Status":"up","IPAddress":" 192.168.xx.106","HostName":"localhost","Name":" ServerAPI03 ","ID":"112800580022"} リクエスト レスポンス
  72. 72. シンプル監視登録
  73. 73. シンプル監視の登録 POST cloud/1.1/commonserviceitem { "Count": 0, "CommonServiceItem": { "Description": "ServerAPI03", "Icon": {}, "Tags": [], "Provider": { "Class": "simplemon" }, "Settings": { "SimpleMonitor": { "NotifySlack": { "Enabled": "False" }, リクエスト "NotifyEmail": { "Enabled": "True" }, "Enabled": "True", "HealthCheck": { "Protocol": "ping" }, "DelayLoop": 60 } }, "Status": { "Target": "133.242.70.90" }, "Name": "133.242.70.90" } } シンプル監視は アプライアンス関連APIの commonserviceitem を通して設定をおこないます。
  74. 74. シンプル監視の登録 curl --user "Access_Token":"Access_Token_Secret" -X PUT -d '' '{"CommonServiceItem":{"Name":"133.242.70.90","Status":{"Target":"133.242.70.9 0"},"Settings":{"SimpleMonitor":{"DelayLoop":60,"HealthCheck":{"Protocol":"pin g"},"Enabled":"True","NotifyEmail":{"Enabled":"True"},"NotifySlack":{"Enabled" :"False"}}},"Provider":{"Class":"simplemon"},"Tags":[],"Icon":{},"Description" :"ServerAPI03"},"Count":0}' https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/commonserviceitem | jq . リクエストコマンド { "is_ok": true, "Success": true, "CommonServiceItem": { "ID": "112800580626", } } レスポンス(抜粋) 修正や削除はこのIDを使って指定します
  75. 75. 料金関連
  76. 76. 料金関連 • 料金一覧表取得 • 請求履歴取得 • 請求明細取得
  77. 77. 料金一覧表の取得 – サーバやディスクはゾーンごとに料金が異なります。どのゾーンにリクエストをお こなうかで、どのゾーンの料金が帰ってくるかが決まります – このエンドポイントのみ認証が必要ありません。 • Authorizationヘッダは指定しないでください。 • 次のヘッダを指定してください。 X-Requested-With: XMLHttpRequest • 廃止されたサービスや、一部のお客様向けの特殊なサービス等は表に含まれません。 石狩第一ゾーンの価格一覧表を取得 curl -H "X-Requested-With:XMLHttpRequest" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/public/price.json curl --user "Access Token":"Access Token Secret" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/public/price.json APIキーによる認証を行う場合のリクエストコマンド APIキーによる認証を行わない場合のリクエストコマンド GET /public/price リクエスト
  78. 78. 料金一覧表の取得 "65": { "ServiceClassPath": "cloud/plan/2core-3gb", "ServiceClassName": "plan/2core-3gb", "ServiceClassID": 50179, "Price": { "Zone": "is1a", "Monthly": 4050, "Hourly": 19, "Daily": 203, "Base": 0 }, "IsPublic": true, "DisplayName": "プラン/2Core-3GB" } レスポンス(抜粋) サーバやディスクなどの料金は、時間、日次、月次それぞれで料金が決まっています。 Hourly x 時間数 : Daily (およそ10時間前後) Daily x 日数 : Monthly (およそ20時間前後) のどちらが安いかで、どちらの料金が採用になるかが決まります。Monthlyが上限となります
  79. 79. アカウントIDの確認 • APIを実行するには、アカウントのアカウントIDが必要 • testaccount  xxx000001(数字列) • アカウントコード  アカウントのリソースID(アカウントID) curl --user 'ACCESS_TOKEN':'ACCESS_TOKEN_SECRET' https://secure.sakura.ad.jp/cloud/zone/tk1a/api/cloud/1.1/auth-status | jq -c " .Account " {"Code":"billTest","Name":"APIテスト用","Class":"account","ID":"000000526782"} レスポンス リクエストコマンド ※どのゾーンにリクエストしても構いません アカウントID
  80. 80. 過去の請求履歴を確認 curl --user "ACCESS_TOKEN":"ACCESS_TOKEN_SECRET" https://secure.sakura.ad.jp/cloud/zone/tk1a/api/system/1.0/bill/by-contract/112700526782 | jq . リクエストコマンド ※どのゾーンにリクエストしても構いません ※ベースURLが請求関連APIとなります。 アカウントID 請求履歴などを取得するのは請求関連APIと読んで、APIのベースURLが異なります。 アカウントIDを指定して取得します。
  81. 81. 過去の請求履歴を確認 { "is_ok": true, "ResponsedAt": "2016-06-01T13:33:13+09:00", "Count": 12, "Bills": [ { "PaymentClassID": 200, "PayLimit": "2016-06-30T00:00:00+09:00", "Paid": false, "MemberID": "xxx000001", "Date": "2016-06-10T00:00:00+09:00", "BillID": 13481639, "Amount": 4330 }, .....(月が繰り返します) } レスポンス 請求書No。さらに詳細を見るときに使います。 請求書No。さらに詳細を見るときに使います。 請求書No。さらに詳細を見るときに使います。 請求年月
  82. 82. 請求明細を取得(CSV) printf "`curl --user 'ACCESS_TOKEN':'ACCESS_TOKEN_SECRET' https://secure.sakura.ad.jp/cloud/zone/tk1a/api/system/1.0/billdetail/xxx000001/ 000000000/csv | jq .Body`" リクエストコマンド(請求関連API) ""連番","請求書番号","利用年月","支払いステータス","会員ID","アカウントコード","リソー スID","商品ID","商品名","ゾーンID","ゾーン名","日数","時間","商品金額(税別)","税金","リ ソース名" "1","000000000","2015/09","入金済み","xxx000001","payTest","112700526782","50000","さく らのクラウド",,,"30","0","0","0", "2","000000000","2015/09","入金済み","xxx000001","payTest","112700654736","50118","ISOイ メージアップロード/5GB","is1b","石狩第2ゾーン","30","0","100","8","名称未設定 ISOイメー ジ 14ef10fedac" "3","000000000","2015/09","入金済み ","xxx000001","payTest","112700675125","50295","GSLB",,,"28","16","500","40","テスト" " レスポンス 請求書ID アカウントID JSON形式の応答は、必要な情報を追加で山ほど取ってくる必要があるため、CSV形式を推奨します。 エスケープコードの処理のため
  83. 83. まとめ • API直接実行するのも思ったよりも敷居は高くな い • しかし、複雑なことをやろうとするとプログラ ミングが必要 – やはり、SDKを使った方が便利>Saklient – Saklientが対応していないAPIは直接叩く必要もある
  84. 84. さくらのクラウドクライアントライブラリ saklient http://sakura-internet.github.io/saklient.doc/
  85. 85. Apendix • さくらのクラウドAPI – http://developer.sakura.ad.jp/cloud/api/1.1/ – 価格一覧表をAPI経由で取得できるようになりました – http://cloud-news.sakura.ad.jp/2016/04/01/cloud-pricelist-api/ • さくらのクラウドAPI請求関連API – http://developer.sakura.ad.jp/cloud/api/1.1/bill/ • 請求関連APIの使い方 – http://cloud-news.sakura.ad.jp/billapi/ • 【TIPS】さくらのクラウドでAuto Scaling – http://cloud-news.sakura.ad.jp/2016/03/18/auto-scaling/ 85
  86. 86. ご清聴ありがとうございました ご清聴ありがとうございました さくらインターネット エバンジェリスト 寺尾 英作 講演依頼等は、e-terao@sakura.ad.jp まで 86 86 eisaku.terao @eterao 直近講演テーマ ・今さら聞けない!? クラウドが中小企業にもたらす真の価値 ・さくらのクラウド ハンズオン ・東南アジアを中心とした、海外ITビジネス事情(MSPJ) ・幅広いニーズに応える、さくらインターネットのサービス ・さくらのクラウドの典型的な構成例

×