kWatanabe 記事一覧へ

kWatanabe の 技術帖

某企業でOSや仮想化の研究をやっているインフラ系エンジニア。オンプレとクラウドのコラボレーションなど、興味ある技術を綴る。

AWS・Azure・自宅にてマルチでハイブリッドなクラウドを作ってみた(その2)

大要

  • 自学自習のため、マルチでハイブリッドなクラウドを作ってみた
  • ゴールは、各リソースをパブリックな通信なしで利用できるようにすること
  • 前回はL3レベルでのサイト間VPNで、IaaS層のハイブリッド化行った
  • 今回は AWS と Azure の PaaS を各拠点のネットワークで相互に繋いで PaaS層のハイブリッド化を行う

前回はこちら kwatanabe.hatenablog.jp

背景

  • 前回記事参照

PaaSのハイブリッド化

  • 前回の作業でAmazon VPC、Azure VNet、自宅のLANが相互に接続されている
  • PaaSをこれらVPCやVNetに所属させることができれば、PaaSのハイブリッド化も実現できる
  • Azure PaaS と AWS PaaS では設計思想の違いから必要なアプローチが異なる

AWS PaaS

  • AWS PaaS は VPC に対してプラガブルな設計となっているので、多くのメニューでそのまま VPC のサブネットに繋げることができる
  • 例えば、Amazon RDS だと作成時にVPCとサブネットグループを指定できる
  • RDSのマルチAZ対応するには適切なルーティング設定が VPC に必要

f:id:kWatanabe:20200926121949p:plain
Amazon RDS での 接続先VPC の設定

Azure PaaS

  • VNet は IaaS のための仕組みであり、PaaS の接続は考慮されていない
  • Azure PaaS は各リソースがパブリックな世界で孤立している
  • VNet に繋ぐには、そのための機能が PaaS に備わっている必要がある
  • 例えば、Azure App Service では以下の機能が提供されている
    • VNet Integration
      • Gateway-required VNet Integration
      • Region VNet Integration
    • Hybrid Connections
    • プライベートエンドポイント (Preview)

docs.microsoft.com docs.microsoft.com docs.microsoft.com

具体例

f:id:kWatanabe:20200926124232g:plain
デモ環境のイメージ

  • Azure App Service と Amazon RDS を繋いで簡単なWebシステムを作る
  • RDS のパブリックアクセシビリティを無効にして、マルチクラウドが実現できている事を確認する
  • App Serivce を VNet に接続する手段は Region VNet Integration を用いる

Amazon RDS

インスタンスを作成する。作成に特別な手順は必要ない。以下のパラメータ以外は好きに選んでかまわない。

  • エンジン:MySQL (MySQL Community 8.0.20)
  • マルチAZ配置:なし
  • 接続VPC:Hybrid-VPC (前回記事参照)
  • サブネットグループ:新規
  • パブリックアクセス:なし
  • VPCセキュリティグループ:3306/TCPを許可
  • アベイラビリティゾーン:Hybird-Subnetと同じところ
  • データベースポート:3306
  • 認証:パスワード認証
  • 最初のデータベース名:wordpress

インスタンスがデプロイされたら、コンソールからエンドポイント名を確認したうえで、同じサブネットに属するEC2からプライベートIPアドレスを調べておく。

f:id:kWatanabe:20200926125304p:plain
RDSのエンドポイントの確認

$ nslookup XXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com
Server:         192.168.20.2
Address:        192.168.20.2#53

Non-authoritative answer:
Name:   XXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com
Address: 192.168.20.225

以上でRDSの構築は完了。

Azure App Service

インスタンスを作成する。まずは通常の手順でデプロイする。

ネットワーク⇒VNet統合から、以下の設定を行う。

  • 仮想ネットワーク:前回作成した Azure VNet
  • サブネット:Hybrid_Subnet_Dammy

構成⇒アプリケーションの設定から、以下の設定を行う。

  • パラメータ:WEBSITE_VNET_ROUTE_ALL
  • 値:1

プロイセンター⇒FTPから接続情報を取得して、FTPクライアントで任意のディレクトリに Wordpressアーカイブを展開する。

  • なお、5.5系はPHP7.4以降を推奨としているため、5.4系を用いる

一旦、App Serivceを「停止」⇒「起動」でコールドブートした後に、WordPress をデプロイした URL にブラウザで繋ぎ、初期設定を行う。

  • データーベースのホスト名は、RDS をデプロイしたときに調べたプライベートIPアドレスを指定する。

f:id:kWatanabe:20200926130633p:plain
Wordpressの初期設定

以上でApp Serivceの構築は完了。

まとめ

f:id:kWatanabe:20200926131504p:plain
最終構成

  • 本記事の手順を実施した時点で上記の環境が完成する。
  • App Serivce にアクセスすればWordpressが稼働しており、その後にRDSを停止させれば「データベース接続エラー」となるはず。
    • Region VNet Integration は IaaS ⇒ PaaS 方向の通信をフォワードしない
    • App Service の前段に自宅やAWSで動くリバースプロキシを挟みたい場合などは他の方法が必要になる
  • Azure PaaS のハイブリッド化はなかなかの鬼門のようだ

AWS・Azure・自宅にてマルチでハイブリッドなクラウドを作ってみた(その1)

大要

  • 自学自習のため、マルチでハイブリッドなクラウドを作ってみた
  • AWS、Azure、自宅の各拠点をプライベートなネットワークで結ぶ
  • ゴールは、各リソースをパブリックな通信なしで利用できるようにすること
  • まずは、Softether VPNでサイト間VPNを構築した

次回は PaaS を VPN に繋げる話。 kwatanabe.hatenablog.jp

背景

  • 浦島太郎なkWatanabeにとって、クラウドといえばOpenNebula、OpenStack、CloudStackであって、パブリックなクラウドは馴染みがない
  • コレはイカんと思い、会社の勉強会*1にかこつけて、何かパブリッククラウドで遊んでみようと思った
  • システムを知るにはまずは足回りからがモットーなので、まずは生の計算機とネットワークが見えそうな、マルチでハイブリッドなクラウドに挑戦した

マルチでハイブリッドなクラウド

f:id:kWatanabe:20200925222427g:plain
マルチでハイブリッドなクラウド

サイト間VPN

f:id:kWatanabe:20200925234646g:plain
サイト間VPNのイメージ

  • まず、各拠点をプライベートなネットワークで結ぶためにサイト間VPNを作る
  • 各事業者でVPNのPaaSを提供
  • 今回は1つの仕組みで完結させる為、Softether VPNを採用
  • 注意点としては、AWSもAzureも仮想ネットワークはL3レベルでフィルタされているので、L2ではなくL3でサイト間VPNをはる必要がある

ネットワークの整備

自宅

  • 192.168.1.0/24 が整備されている
  • VPNサーバ以外の各端末のルーティングテーブルを設定する
    • 192.168.20.0/24 via 192.168.1.249 (VPNサーバの仮想L3スイッチの内向きアドレス)
    • 192.168.21.0/24 via 192.168.1.249 (同上)
    • 192.168.30.0/24 via 192.168.1.249 (同上)
    • 192.168.31.0/24 via 192.168.1.249 (同上)
    • 192.168.10.0/24 via 192.168.1.249 (同上)

Amazon VPC

  • CIDRの範囲:192.168.20.0/24 と 192.168.21.0/24
  • サブネット「Hybrid-Subnet」
    • CIDR:192.168.20.0/24
    • ルートテーブル
      • 192.168.1.0/24 via 192.168.20.1 (VPNブリッジのEC2インスタンス)
      • 192.168.30.0/24 via 192.168.20.1 (同上)
      • 192.168.31.0/24 via 192.168.20.1 (同上)
    • アベイラビリティゾーン:Hybrid-Subnet-Dammy と異なるところ
  • サブネット「Hybrid-Subnet-Dammy」
    • CIDR:192.168.21.0/24
    • アベイラビリティゾーン:Hybrid-Subnetと異なるところ
    • ルートテーブルなし

Azure VNet

  • IPv4 アドレス空間:192.168.30.0/24 と 192.168.31.0/24
    • サブネット「Hybrid_Subnet」
      • CIDR:192.168.30.0/24
      • ルートテーブル
        • 192.168.1.0/24 via 192.168.30.100 (VPNブリッジのVirtualMachine)
        • 192.168.20.0/24 via 192.168.30.100 (同上)
        • 192.168.21.0/24 via 192.168.30.100 (同上)
    • サブネット「Hybrid_Subnet_Dammy」
      • CIDR:192.168.31.0/24
      • ルートテーブルはHybrid_Subnetと同じ
    • BastionHost:無効化
    • DDoS Protection Standard:無効化
    • ファイアウォール:無効化

Softether VPN のインストール

自宅(VPNサーバ)

  • 環境は、LXCで構築した Debian 10 のシステムコンテナ
  • ネットワークインタフェースは2つ
    • eth0:VPN通信を受け付けるNIC
      • veth (仮想NICをホストのNICにブリッジ接続)
      • ルータから 5555/TCP ポートがフォーワードされる
      • IPアドレスは 192.168.1.0/24 のどこか(なんでもいい)
    • eth1:パケットをローカルに流すためのNIC
      • phys (物理NICをパススルー)
      • プロミスキャスモードにする
      • IPアドレスは未割り当て

SoftEther の サイトから Linux 64bit 用のバイナリを入手してリンクする

$ sudo apt install wget gcc make
$ cd /opt
$ wget https://jp.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz -O - | sudo tar xzf -
$ cd /opt/vpnserver
$ sudo make

systemdのユニットファイルを作成して、自動起動を有効化する

$ cat << EOF | sudo tee /etc/systemd/system/softether-vpnserver.service
[Unit]
Description=Softether VPN Server Service
After=network.target

[Service]
Type=forking
User=root
ExecStart=/opt/vpnserver/vpnserver start
ExecStop=/opt/vpnserver/vpnserver stop
Restart=on-abort
WorkingDirectory=/opt/vpnserver

[Install]
WantedBy=multi-user.target
EOF
$ sudo chmod +x /etc/systemd/system/softether-vpnserver.service
$ sudo systemctl daemon-reload
$ sudo systemctl start softether-vpnserver
$ sudo systemctl enable softether-vpnserver

適当な端末から eth0 に向かって、SoftEther VPN Managerで接続して、以下の設定を施す。

  • 仮想HUB「DEFAULT」の設定
    • ユーザ名:テキトー
    • 認証方法:パスワード認証
    • SecureNATは無効
    • ローカルブリッジ:eth1
  • 仮想HUB「HYBRID」の設定
    • ユーザ名:テキトー
    • 認証方法:パスワード認証
    • SecureNATは無効
  • 待受ポート:5555/TCP (SE-VPN) のみ
  • 仮想L3スイッチの設定
    • インターフェース
      • 192.168.1.249 ⇒ 接続先HUB「DEFAULT」に接続
      • 192.168.10.1 ⇒ 接続先HUB「HYBRID」に接続
    • ルーティングテーブル
      • 192.168.20.0 ⇒ 192.168.10.2 (AWS用)
      • 192.168.30.0 ⇒ 192.168.10.3 (Azure用その1)
      • 192.168.31.0 ⇒ 192.168.10.3 (Azure用その2)

以上で設定完了。

AWS および Azure(VPNブリッジ)

  • Amazon EC2 と Azure VirtualMachine で Debian10 のインスタンスを作成
    • NICはそれぞれ自身の VPC なり VNet なりに属するインタフェース1個
    • パブリックIPあり
    • プライベートIPは手動指定
      • AWS:192.168.20.100/24
      • Azure:192.168.30.100/24
    • モニタモードに相当する機能を有効化
      • AWS:送信元/送信先チェックを無効にする
      • Azure:Enable IP forwardingを有効にする
    • セキュリティグループ
      • 自分のサブネット内のパケットすべて許可
      • 5555/TCP (SE-VPN) を許可

SoftEther の サイトから Linux 64bit 用のバイナリを入手してリンクする。

$ sudo apt install wget gcc make
$ cd /opt
$ wget https://jp.softether-download.com/files/softether/v4.34-9745-rtm-2020.04.05-tree/Linux/SoftEther_VPN_Bridge/64bit_-_Intel_x64_or_AMD64/softether-vpnbridge-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gz -O - | sudo tar xzf -
$ cd /opt/vpnbridge
$ sudo make

ユニットファイルを作成して、自動起動を有効化する

$ cat << EOF | sudo tee /etc/systemd/system/softether-vpnbridge.service
[Unit]
Description=Softether VPN Bridge Service
After=network.target

[Service]
Type=forking
User=root
ExecStart=/opt/vpnbridge/vpnbridge start
ExecStop=/opt/vpnbridge/vpnbridge stop
Restart=on-abort
WorkingDirectory=/opt/vpnbridge

[Install]
WantedBy=multi-user.target
EOF
$ sudo systemctl daemon-reload
$ sudo systemctl start softether-vpnbridge
$ sudo systemctl enable softether-vpnbridge

VPNブリッジは自力でアドレス変換しないとダメなのでポートフォワードを有効化

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
$ sudo sysctl -p

適当な端末から、SoftEther VPN Managerで接続して、以下の設定を施す。

  • 仮想HUB「BRIDGE」
    • ポート:5555/TCP
    • ローカルブリッジ:新しいtapデバイス ( vpntap )
    • カスケード接続:仮想HUB「HYBRID」
      • ブリッジ名:HYBRID
      • 接続先:自宅のVPNサーバ
      • 状態:オフライン
    • ユーザ名とパスワード:仮想HUB「HYBRID」に設定したもの

SoftEther VPN の設定後に、tapデバイスに ip addr でIPアドレスを設定

  • AWS:192.168.10.2
  • Azure:192.168.10.3

SoftEther VPNの設定後に、ip route でローカルのルーティングテーブルを編集

  • AWS
    • 192.168.1.0/24 via 192.168.10.1 dev tap_vpntap
    • 192.168.30.0/24 via 192.168.10.1 dev tap_vpntap
    • 192.168.31.0/24 via 192.168.10.1 dev tap_vpntap
  • Azure
    • 192.168.1.0/24 via 192.168.10.1 dev tap_vpntap
    • 192.168.20.0/24 via 192.168.10.1 dev tap_vpntap

改めて、SoftEther VPN Managerで接続して、以下の設定を施す。

  • 仮想HUB「BRIDGE」
    • カスケード接続:仮想HUB「HYBRID」
      • 状態:オンライン

以上で設定は完了。

まとめ

f:id:kWatanabe:20200926004223g:plain
本記事の手順完了時点の状況

  • 本記事の手順を実施した時点で上記の環境が構築できている
  • IaaS レベルのハイブリッドクラウドであれば、これで構築完了
  • 各拠点間の端末から ping を送りあうと疎通ができるはず
  • 次回は各拠点に PaaS をデプロイして、疎通できるようにする

次回に続く kwatanabe.hatenablog.jp

*1:会社の勉強会だけど、作業は資料作成のふくめて4連休のオフの時間にしたし、機材も自費でクラウドを契約したので会社のカネは1円も使ってない。趣味でやったことを会社の勉強会で喋っただけ。

クラウド課金で死なないための予算管理

大要

  • パブリッククラウドは使った分だけ課金される
  • リソース解放漏れにより、思わぬ請求が来ることを防止したい
  • 予算に基づいたアラートを設定した
  • 思わぬ課金に気づけるようになった

パブリッククラウドは使えば使うだけ課金される

浦島太郎なkWatanabeは、計算機リソースに対する課金といえばリース代や電気代、あるいはVPSなどの固定額モデルしか馴染みがない。

これらは無茶な使い方をしても、性能が出ない・機能が足らないなど、クールダウンできるタイミングがあったけど、パブリッククラウドではそうはいかない。 リソースは足りなければ足されるし、請求額も膨れていく。

自制できずに課金されるなら自業自得だが、解放漏れによる課金はいただけない。

予算を管理する

リソースを監視する仕組みを入れてもいいけども、個別に対応して漏れると本末転倒なので、まずは水際対策として課金状況に応じたアラートを設定する。

Microsoft Azure の場合

docs.microsoft.com

Azure Portalの「サブスクリプション」>「予算」から、予算額とアラートを出す閾値を設定できる。

スコープはサブスクリプションでもいいし、リソースグループでもいい。 解放漏れなどイレギュラーな課金への対策はサブスクリプションに設定して、実際の予算はリソースグループにしておくと、管理が楽かもしれない。

f:id:kWatanabe:20200913160433p:plain
Azureでの予算設定の例

使ったつもりもないのに課金されている場合に備えて1000円。自己牽制として4000円。 額は、とりあえず適当に入れた。これで閾値をまたいだ際に、約1時間以内にアラートが届くようになるらしい。

AWSの場合

docs.aws.amazon.com

AWS Management Consoleの「マイアカウント」>「Budgets」から、予算額とアラートを出す閾値を設定できる。

AWSの場合、課金単位は全てUSDなので、予算もUSDで指定する。 これは、請求額をJPYにしても同じ。

アラートを出す閾値は「実際に掛かった額」または「予測額」で設定できるので、組み合わせて使えばリソースの解放漏れを事前に察知できるかもしれない。

f:id:kWatanabe:20200920135255j:plain
AWSでの予算設定の例

こちらも、同様に使ったつもりが無い場合と自己牽制のために2つのアラートを設定。額はとりあえず適当に入れた。

まとめ

  • 従量課金生活に慣れていないので、AzureとAWSに予算の設定を行った。
  • 使ったつもりが無いのに課金されている場合に備えた少額のアラートと、自己牽制のためのそれなりの額のアラートを設定した。
  • ガラケー時代に味わったパケ死の再来とならないよう注意したい。

はじめまして kWatanabeです

意気込み

はじめまして。kWatanaeです。

2010年頃には、iTRONやRT-LinuxXenKVM などを活用したリアルタイムシステムの研究。

2015年頃には、OpenStack、CloudStack などのプライベートクラウド や Pacemaker、ZooKeeper、ZeroMQ などを活用したHAクラスタの開発をやってました。

その後、炎上プロジェクトにドナドナされ、2020年頃に戻ってきたのはいいものの、世の中はパブリッククラウド一色。それもPaaS/SaaS/FaaSの全盛期。

浦島太郎からイマドキのエンジニアなるため、頑張ります。

これから

パグリッククラウド一色の世の中とはいえ、誰かはオンプレやネットワークもちゃんと見ないといけません。オンプレとクラウドのコラボレーションをテーマとして、Low-Level も High-Level も何でもキャッチアップしていきます。

今後ともよしなに。