先月末からMicrosoft Azureの検証を色々行っているところで蹴躓いた部分を小出しにしてきます。今回はAzure Functionsを使ったサーバーレスな運用の部分で蹴躓いた部分を。
実は、もともとAWSを使って構築してテストをしていたものなんですが、Azure FunctionsでPHPが使えるという事を知り、サーバーレスでいけそうな部分をAzure Functionsで置き換えられたらなぁというところからスタートしました。ところが、AzureはDB周りが非常に弱いので、そこはすでに構築済みのAWS RDSを使うことになったんですね。でも、RDSの3306番ポートを外界にオープンにしたくないなぁということで、色々苦労したわけですわ。
Azure Functionsはコンテナだって聞いていたので「じゃぁ、普通にPHPの関数はなんでも使えるよな」と考えて、shell_exec使ってsshのトンネルを掘れば簡単だよねぇと挑戦したのですが、そこはホレ、大人の事情があってダメだっただけですよ。んじゃぁ、どうすれば良いのかな?と考えた結果、下図の上側に書かれているように両方に小さなインスタンスを立ててトンネル掘れば行けるよな!と思ったわけです。ところが、ネットで探しても下図の下側に書かれているような構成のトンネルを掘る情報しかないわけですわ。
まぁ、こういうコマンドですね。
ssh -f -N -L [入口ポート番号]:[接続先サーバー]:[出口ポート番号] -i [秘密鍵] [踏み台のユーザー]@[踏み台サーバー]
です。これだと、先に書いたように僕が期待する「串刺し」の状態にはならないのです。実際、入口ポート番号は127.0.0.1でしかLISTEN状態にならないのです。
で、いろいろ悩んだわけですよ。Google先生に大変お世話になりました。結果、ようやく判ったんですね。
ssh -f -g -N -L [入口ポート番号]:[接続先サーバー]:[出口ポート番号] -i [秘密鍵] [踏み台のユーザー]@[踏み台サーバー]
崩れないトンネルとか言うらしいですが、「-g」をつけると入口ポート番号は0.0.0.0でLISTEN状態になります。これで串刺しトンネルが完成です。
で、最終的には下図のような構成にして運用したいなぁと。思っています。ぶっちゃけ単一障害点ができてしまっているのは許してもらうとして、これが取り敢えずやりたい事だぞと。
実際、Azure Functionsで作った関数からAWS RDSへの接続は巧くいきました。えぇ、平文通信では巧くいきましたよ。でも、Azure FunctionsからAzure VMの間はローカル接続じゃないんですね。一旦、外に出ちゃうように見えるんです。だとすると平文通信は拙いよなぁという事で、SSL対応に修正したら…
この続きは改めてという事で。
コメント