VMware Cloud on AWSの仮想マシン情報をLambdaで取得してみた

VMware Cloud on AWSをLambdaで管理したい。サーバレスサービス使いたい。環境依存減らしたい。な方にお勧めです

こんにちは、AWS事業本部の荒平(@0Air)です。

VMware Cloud on AWSを使っていると、仮想マシンの一覧を取得したくなることがしばしばあります。
リソースの計算であったり、運用管理上のタスクであったり、取得するタイミングは様々あると思いますが、Lambdaから取得できるようにしておけば、ローカルマシンの環境に左右されず、定期実行もできたり嬉しいことがあります。

今回はそれを実装します。

構成図

本エントリで紹介する構成図です。
Lambda VPCを使い、NAT Gateway(Elastic IP)を経由することでvSphereへのアクセスを制御します。

用意した検証環境の都合上、VMware Cloud on AWSとLambdaのアカウントは別になっていますが、同一アカウントでも問題なく利用できます。

実装方法

紹介する実装手順は以下の通りです。

  1. vCenter情報の確認
  2. Lambdaレイヤーの作成
  3. Lambda関数の作成
  4. Lambda関数の権限、VPC設定
  5. VMware Cloud on AWSのファイアウォール(NSX)設定

(1) vCenter情報の確認

VMware Cloud on AWSの仮想マシン情報を得るためには、vCenterへのアクセスを行います。
VMCコンソールから、SDDCの情報を確認し、[設定]タブより vCenter Server FQDN(またはIPアドレス)を控えておきます。

(2) Lambdaレイヤーの作成

pyVim, pyVmomiのLambdaレイヤーを作成します。
以下に示すコードはUbuntu上で作成するものなので、各OSによって読み替えてください。

mkdir -p lambda_layer/python/lib/python3.10/site-packages
python3 -m venv venv
source venv/bin/activate
pip install pyVim pyVmomi
deactivate
cp -R venv/lib/python3.10/site-packages/* lambda_layer/python/lib/python3.10/site-packages/
cd lambda_layer
zip -r ../layer.zip .

作成した layer.zip をLambdaレイヤーとしてアップロードします。
※ 私のようにローカルでレイヤーを作成しなかった場合は、scp コマンドなどで一旦ファイルを手元に置きます。

(3) Lambda関数の作成

Lambda関数をPythonで新規作成し、コードソース部に以下のコードを記述します。

from pyVim import connect
from pyVmomi import vmodl
from pyVmomi import vim

def lambda_handler(event, context):
    host = event['host']
    user = event['user']
    password = event['password']

    try:
        service_instance = connect.SmartConnect(host=host, user=user, pwd=password)

        content = service_instance.RetrieveContent()
        container = content.viewManager.CreateContainerView(content.rootFolder, [vim.VirtualMachine], True)

        for entity in container.view:
            print("Name: ", entity.name)
            print("Power state: ", entity.runtime.powerState)

        connect.Disconnect(service_instance)

    except vmodl.MethodFault as error:
        print(f"Caught vmodl fault: {error.msg}")
        return 1

    return 0

このコードではvCenterのホスト名、ユーザー名、パスワードはイベントで渡す仕組みにしているので、以下のようにイベントを作成して認証情報を渡します。

{
  "host": "vcenter.sddc-xxx-xxx-xxx-xxx.vmwarevmc.com",
  "user": "cloudadmin@vmc.local",
  "password": "xxxxxxxxxxxxxxxx"
}

[カスタムレイヤー]を選択して、前手順で作成したレイヤーを関数に追加します。

(4) Lambda関数の権限、VPC設定

vCenterへの管理ゲートウェイアクセスを実施するためには、IP経路の制御が必要であるため、今回はVPCのNAT Gatewayを経由してアクセスするように設定します。
そのため、Lambda関数のロールには、AWSLambdaVPCAccessExecutionRole のマネージドルールを追加します。

関数内の[VPC]タブから、「編集」をクリックします。

NATゲートウェイにルーティングのあるプライベートサブネットを指定してVPCに接続します。
ウィザード中にも書いていますが、関数がインターネット接続を行うためにはこのルーティングが必要です。

また、このとき(実行するオペレーションにもよりますが)タイムアウト値を十分な長さに調整しておきます。

ここまで出来れば、AWS側の設定操作は終了です。

(5) VMware Cloud on AWSのファイアウォール(NSX)設定

NSXの設定画面を開き、VPC Lambda (via NAT Gateway)からの通信許可ルールを作成します。
([セキュリティ] - [ゲートウェイ ファイアウォール] - [管理ゲートウェイ])

設定項目

  • 名前
  • 送信元
    • Lambdaが経由するNAT GatewayのEIP
  • 宛先
    • vCenter
  • サービス
    • HTTPS

[発行]をクリックして設定を反映します。

実行結果

それでは、認証情報のイベントと共に実行してみます。

狙い通り、vCenterに登録されている仮想マシン名と、電源状態の一覧が取得できました!

おわりに

LambdaからVMware Cloud on AWSのvCenterへのアクセスを試してみました。
今回は仮想マシン名と電源状態の取得を紹介しましたが、作り込み次第で何でもできそうです!

今後、実際に採用できそうな構成も作ってみて紹介できればと思います。

このエントリが誰かの助けになれば幸いです。

それでは、AWS事業本部 コンサルティング部の荒平(@0Air)がお送りしました!