開発室ブログ

Postman Web API

Postman * ConoHa APIでファイアウォール設定

私、個人的にVPSクラウドなどを契約し、検証や遊びなどに利用しています。(子供の相手で…まとまった時間が…)
最近新しくConoHa VPSを取得する際、APIを使ってみました。
今回はそのときの話を。

ConoHaのファイアウォール

ConoHaのVPSは、ちゃんとインフラ側にFW(パケットフィルタ)がついています。ですが、コントロールパネルからの操作では、以下のように融通が利きません…

  • 80と443だけ通したいのに、設定上FTPもついてきちゃう
  • SSHのポート番号変えようと思っても、22しか空かない
  • 8080とかHTTP通したいものがあるのに空かない…

なので すべて許可 にして iptables や firewalld で塞ぐ、というパターンを取ることも多いんじゃないかなと。(というかデフォルトが すべて許可 か?) 問題ないとは思いますが、サーバーで受けるよりFWで受けてもらったほうが、負荷的には有利かな? ということでやってみます。

Postmanつよい…

しかしcurlで叩くの面倒だなぁ…。業務でWeb APIの設計開発を行うこともあるし、この際なんかツール探すか…ということで Postman に出会いました。

www.getpostman.com

便利そうだったので使ってみると、こいつがとても強力です。
ここでは、実際にPostmanでConoHa APIを使った際の手順をご紹介しようと思います。

準備

ConoHaコントロールパネルよりAPIユーザーを作成します。ユーザー情報やテナント情報を控えておいてください。
また、この記事は東京リージョン前提ですので、別リージョンの場合はエンドポイントを読み替えてください。

次に、Postman公式よりクライアントを落としてきます。私は個人で利用していたので、自分のGoogleアカウントで作成しました。

f:id:ajdev:20171107164017p:plain
初期じゃないけど、こんな画面

変数を作っておく

Postmanは環境変数を扱えるので、変数を作っておくと便利です。ここに接続情報や、取得したトークンの値をまとめておくことができます。
画面右上、この辺で設定。

f:id:ajdev:20171107170741p:plain
左から [

環境変数セット選択] [変数クイックビュー] [環境変数管理]

一番右の歯車っぽいアイコンをクリックして MANAGE ENVIRONMENTS を開き Addボタン を押すと以下の設定画面が表示されます。

f:id:ajdev:20171107170509p:plain

ここで、環境変数のセットを作成することができます。複数作成しておけば、開発環境やステージングで変数を丸ごと変えることができて便利。
一番上のテキストボックスにはこの環境の名前、下にはKey-Value形式で値を入れていきます。
ユーザID、パスワード、テナントID、トークン(まだ空でいい)などを入れておくと楽かと思います。

設定したらこんな感じで見れます(歯車横の目玉? をクリック)
いいですね。

f:id:ajdev:20171107172742p:plain

ConoHa API トークンを取得

さっそく、トークンを取得してみます。
Postman画面上、一番左上の Newボタン より Request を選択します。すると下記画面が表示されます。

f:id:ajdev:20171107173349p:plain

リクエストの名称を設定し、後は保存先を指定してSaveします。保存先は Collection というディレクトリ管理っぽい感じになっているので
+ Create Collection からコレクションを作成して保存すると良いかと(コレクションはまとめて実行することもできます)

エンドポイントは
POST https://identity.tyo1.conoha.io/v2.0/tokens
なので、まずはこんな感じで設定。

f:id:ajdev:20171107175107p:plain

上から見ていって、メソッドはPOST / リクエスト先URLを指定。その下から詳細を入力していきます。

AuthorizationHeaders は何もせず Body をクリックして送信内容を設定します。

トークン発行 – Identity API v2.0 / ConoHa API

こちらに Request Json があるのでコピペして、上記画像のように変数を指定します(宣言した変数名を {{}} で囲めばOK!)
テキストエリアの上で raw にチェックを入れ、その右にあるプルダウンを JSON(application/json) にします。
すると、PostmanがHeadersContent-Type application/jsonを追加してくれます! すごい。
できたら Sendボタン を押してリクエストを飛ばしてみてください。

f:id:ajdev:20171108092523p:plain
問題なければレスポンスが下に表示される。 \`Status: 200 OK\` ですね。

トークンを変数にセット

リクエストのたびにトークンをコピペするのも面倒なので、先ほど宣言した変数に代入します。
ここでは Tests を利用してやってみましょう。

こちらを参考にしまして、ConoHa用に合わせて少し修正
APIの開発がむちゃくちゃ捗る「Postman」の使い方 – WPJ

let OK = responseCode.code === 200;
tests['Successful -> Get token'] = OK;

if (OK) {
    let jsonData = JSON.parse(responseBody);
    pm.environment.set('TOKEN', jsonData.access.token.id);
}

pm.environment.set()の第一引数を、自分で宣言した変数名に合わせてください。この例では TOKEN ですね。
で、このコードをこんな感じで入力します。

f:id:ajdev:20171108094220p:plain
\`Tests\` タブからコードを入力。ConoHaの

トークンは `access->token->id` 。

もう一度Sendしてリクエスト、成功するとトークン用変数が設定されます! 環境変数を確認してみてください。これで他のリクエストを実行するとき{{TOKEN}}が使えますね!

また、リクエストの作成が大体終わったらSendボタンの右にあるSaveボタンで保存してくださいね。

ファイアウォール設定するには?

トークンが取れたので、このはと会話できますね。
下記サイトさんを参考にさせていただきまして、設定していきます。

impov.hatenablog.com

手順としてはこうなります

  1. セキュリティグループ追加
  2. セキュリティグループのルール作成
  3. セキュリティグループをネットワークポートに適用

今回は

  • HTTP用に80と443
    • セキュリティグループ名:http-set
  • SSH用に2222
    • セキュリティグループ名:ssh-2222

を開放する感じでやってみます。最終的なコレクションやフォルダはこんな感じでしょうか?

f:id:ajdev:20171108104533p:plain
命名や分け方はそれぞれですが、少なくとも分けたほうがわかりやすいかと

セキュリティグループを追加する

セキュリティグループ ルール作成 – Network API v2.0 / ConoHa API

ということなので、左上の New をクリックして新たにリクエストを作成します。先ほど作ったコレクションの中に、セキュリティグループ作成用のフォルダを作ってまとめるといいかもしれませんね。リクエストはメイン画面上でドラッグ&ドロップで移動できます。
後は、トークンを作成した時と同様に、リクエストの設定をしていきます。

POST https://networking.tyo1.conoha.io/v2.0/security-groups に対して

{
    "security_group": {
        "name": "ssh-2222",
        "description": "SSH Port"
    }
}

こいつを送信します。

f:id:ajdev:20171108105818p:plain
メソッドをPOSTにしてください。ヘッダには認証用 X-Auth-Token に

トークンの変数をセットします。

f:id:ajdev:20171108122912p:plain
Bodyも

トークン取得と同様、JSONでセット。

正しく送信できると201 Createdが返ってくるはずです。レスポンスのJSONデータには作成されたセキュリティグループIDが入っているので、控えておいてください。

{
    "security_group": {
        "tenant_id": "xxxxxxxxxxxxxxxxxxxxxxxxxx",
        "description": "",
        "id": "d640f9e7-f329-4813-919e-0382799f6ce4", ← コレ

ちなみに、レスポンス表示画面から、値をドラッグして選択→右クリックで変数に格納することもできます。

f:id:ajdev:20171108124029p:plain
グループID用の変数作っちゃってもいいかもですね

こんな感じでhttp-setとssh-2222のセキュリティグループを作成します。コレクションが表示されているところで、リクエストを右クリック→ Duplicateできるので、コピーして作ってしまいましょう。

セキュリティグループのルールを作成

グループができたので、次はそのグループのルールを作ります。

セキュリティグループ ルール作成 – Network API v2.0 / ConoHa API

まずはPostmanで
POST https://networking.tyo1.conoha.io/v2.0/security-group-rules
に対するリクエストを作成します。URLBodyを変えるだけなので、グループ作成時のリクエストをコピーして作成してもOK。

Bodyに公式のリクエスト用JSONをコピペ、自分用に修正します。SSHの2222用であれば

{
    "security_group_rule": {
        "direction": "ingress",
        "ethertype": "IPv4",
        "security_group_id": "{{SEC_GROUP_ID_SSH}}",
        "port_range_min": "2222",
        "port_range_max": "2222",
        "protocol": "tcp"
    }
}

こんな感じ。グループIDは変数になってますが、手動でも構いません。
Sendボタンで送信して201 Createdが返ってくればOK!

あとは同様に、80と443を適用していきます(グループIDを間違えないように注意!)

今までの設定をネットワークポートに適用

ようやく準備が整いました。ルールが設定されたセキュリティグループをVPSに設定すれば完了です。
VPS自体にではなくネットワークポート(仮想NIC?)単位で制御する仕様とのことなので、ひとまずネットワークポートIDを取得します。

ポート一覧取得 – Network API v2.0 / ConoHa API

これは GET https://networking.tyo1.conoha.io/v2.0/security-group-rules
に対して Headers から X-Auth-Token を渡すだけでOKです。

下記、レスポンスは省略してますが、アスタリスクの部分を見てください。
設定したいVPSIPアドレスから見ていって、idを探し当てます。

{
    "ports": [
        {
        "status": "ACTIVE",
        ...
        ..
        .
        "mac_address": "fa:16:3e:16:69:ce",
        "fixed_ips": [
                {
                "subnet_id": "45093c6d....",
!******         "ip_address": "000.000.00.0"
                }
        ],
!******  "id": "08357e0f-3b36-46f4-8f75-bbdb0bfcaa33",
        ...
        ..
        .
},

このポートIDを利用して、次はこいつを叩きます。

ポート更新 – Network API v2.0 / ConoHa API

今までのAPIと違ってPUTを使うのと、リクエストURL中に値が入ることに注意します。こんな感じです。

f:id:ajdev:20171108151541p:plain
いろんなメソッドに対応してるのもいいですね!

Bodyの方はいつも通りrawJSON(application/json)でOKです。
こいつはリクエストのたびに設定が上書きされるので、セキュリティグループは配列でまとめて一括登録。こんなかんじにします。

{
    "port": {
        "security_groups": [
            "{{SG_SSH}}",
            "{{SG_HTTP}}"
        ]
    }
}

送信して成功すれば 200 OK が来ます。レスポンスで変更後のポート情報が返ってくるので、"security_groups"に指定したIDが入っているか確認してください。

後は接続テストやポートのチェック、VPS自身のFW設定などをやればOKですね。
(この記事に誤りがあるかもしれませんので、チェックは入念にお願いします…)

最近はいろいろAPIでできるというか、ホントなんでもAPIでできるのね…と思うことも増えてきました。こういうクライアントがあると、さらっと確認したりできてすごく良いですね。今後は、気楽な気持ちでAPIに触れられそうです。

f:id:ajdev:20171109105641p:plain
(C)Postdot Technologies, Inc.   (C)

GMO Internet,Inc.

RecentPost