[VMware Cloud on AWS] VPC Endpoint経由でS3バケットをコンテンツライブラリとして使ってみた

SDDCが複数ある場合に、S3にデータを置くだけでプライベートなコンテンツ共有ができて便利

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

VMware Cloud on AWSでは、ISOファイルや仮想マシンファイルなどを一部S3バケットに退避させることで、ワークロードデータストアの容量を節約することができます。

基本的には以下の記事で記載されている方法を用いれば利用できます。
今回はインターネット経由ではなく、VPC Endpoint経由にしたいというご要望もありそうだと思い試してみました。

構成図

本エントリの構成図です。
各リソースはSDDCのあるリージョンで作成します(特に、Lambda関数・S3バケット・VPCエンドポイント)

やってみる

1. S3バケットの準備

今回はCloudShellを使ってS3バケットを準備していきます。
CloudShellにて以下コマンドを実行します。適宜、作成するユニークなバケット名に置き換えてください。

aws s3 mb s3://[bucket-name]
aws s3 ls

作成した後、aws s3 lsまたはGUIでバケットが確認できます。

2. ファイルの配置

vCenterにて利用する予定のファイルを配置します。
今回は、Windows Server評価版のISOを環境で利用するため、例としてSERVER_EVAL_x64FRE_ja-jp.isoをアップロードしました。

3. Lambda関数の設定

コンテンツライブラリでは、仕様上、インデックスファイルを設定する必要があります。
自動でjsonを生成するためのコードがGitHubにて公開されているので、これを利用します。

ランタイムをPython 3.x系で設定したLambda関数を用意し、次の2ファイルをコピー&ペーストで配置します。

ファイル名は任意ですが、python/sample_lambda_function_for_make_vcsp_2018.py側でインポートの指定があるためファイル名を変更する場合は併せて変更が必要です。

また、Lambda_handler内に記述のmake_vcsp_2018.make_vcsp_s3()を修正します。
make_vcsp_s3('S3バケット名','S3バケット名/フォルダ',False,'リージョン') となるようにします。

import json
import make_vcsp_2018

def lambda_handler(event, context):
    buf = 'Lambda Content Library Handler. '
    try:
        buf = buf + "Event triggered by file: " + event["Records"][0]["s3"]["object"]["key"]
    except:
        print("No event key found.")
        buf = buf + " No S3 event key found."
        return {
            'statusCode': 200,
            'body': buf
        }

    # If we don't filter out .json files, this script keeps firing in a loop.
    # We don't want the script to fire again when the script itself writes JSON files to the bucket.
    # You could also solve this problem by using a suffix filter in the S3 trigger configuration,
    # but you can only have one suffix per trigger. You would have to create a trigger for every
    # possible filetype that might get uploaded to the bucket. 
    filename = (event["Records"][0]["s3"]["object"]["key"]).lower()
    if filename[-5:] == ".json":
        filter_status = "filtered"
    else:
        # Example usage: make_vcsp_2018.make_vcsp_s3('my-library','library-bucket/lib1',False,'us-east-2')
        # Argument description:
        # my-library - name of the library, 
        # library-bucket/lib1 -  S3 bucket name and folder name
        # false - Flag configured not to skip SSL validation
        # us-east-2 - default region
        # We pass the default region directly to the boto library so we don't have to configure environment variables in Lambda
        make_vcsp_2018.make_vcsp_s3('arap-vmc-content-lib','arap-vmc-content-lib/iso',False,'us-east-1')
        filter_status = "unfiltered"
    
    return {
        'statusCode': 200,
        'body': buf,
        'filterStatus': filter_status
    }

修正したら、Lambda関数の実行ロール権限を変更します。
ロール名をクリックし、IAMの画面にジャンプします。

「ポリシーをアタッチ」から、AmazonS3FullAccessや個別に権限を絞ったポリシーを追加します。
※ここでは割愛していますが、Resource句を用いて操作できるバケットを制限するのが望ましいです

次に、関数のトリガーを設定します。S3バケットにオブジェクトが作成(アップロード)されるか、削除される度にインデックスが更新されることが望ましいです。

バケット名を入力し、All object create eventsAll object delete eventsをイベントタイプに選択します。

4. インデックスファイルの生成を確認

S3バケットにテストファイルを置くなどでLambda関数をキックすると、指定のフォルダ内にitems.jsonlib.jsonが生成されます。
生成されない場合は、エラーを確認してください。(筆者環境では、たまにタイムアウトエラーが発生したため、Lambdaのタイムアウト値を30秒としました)

(参考)中身はそれぞれ以下のような構造でした。

lib.json

{
  "vcspVersion": "2",
  "version": "1",
  "contentVersion": "1",
  "name": "arap-vmc-contents-lib",
  "id": "urn:uuid:cdc53e66-e42a-44dd-a7ee-3afceaa23fe7",
  "created": "2024-03-14T17:49Z",
  "capabilities": {
    "transferIn": [
      "httpGet"
    ],
    "transferOut": [
      "httpGet"
    ]
  },
  "itemsHref": "items.json"
}

items.json

{
  "items": [
    {
      "created": "2024-03-14T17:48Z",
      "description": "",
      "version": "2",
      "files": [
        {
          "name": "SERVER_EVAL_x64FRE_ja-jp.iso",
          "size": 5205041152,
          "etag": "0633bd249cd4d48f5ce31fad2417b5ed-311",
          "generationNum": 1710436077,
          "hrefs": [
            "iso/SERVER_EVAL_x64FRE_ja-jp.iso"
          ]
        }
      ],
      "id": "urn:uuid:c779a731-2578-40cb-9f5d-c5e439cd94c8",
      "name": "iso",
      "properties": {},
      "selfHref": "iso/item.json",
      "type": "vcsp.other",
      "contentVersion": "2"
    }
  ]
}

5. VPC Endpointの作成

SDDCのあるリージョンに、S3のGateway型 VPC Endpointを作成します。
CloudShellにて以下のコマンドを実行します。VPC IDおよびルートテーブルIDは環境に応じて書き換えてください。
(指定したルートテーブルに自動でルートが追加されます)

aws ec2 create-vpc-endpoint --vpc-id vpc-xxxxxxxxxxxxxxxx --service-name com.amazonaws.us-east-1.s3 --vpc-endpoint-type Gateway --route-table-ids rtb-xxxxxxxxxxxxxxxx

作成すると、VPC Endpoint一覧に表示されます。

続いて、ルートテーブルの確認です。
VPC Endpoint宛てのルート、およびSDDC用ENI宛てのルートが登録されていれば、ルーティングは問題ありません。

6. S3バケットポリシーの設定

手順1で作成したS3バケットのポリシーを追加します。

10行目は作成したS3バケット名、
13行目、VPC Endpointの値は、前手順で作成したVPC Endpointにそれぞれ変更してください。

{
    "Version": "2012-10-17",
    "Id": "S3BucketPolicyForVMCContentsLibrary",
    "Statement": [
        {
            "Sid": "AllowAccessFromVPCe",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::arap-vmc-contents-lib/*",
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": "vpce-0ccc5f2fbbf2c5366"
                }
            }
        }
    ]
}

7. VMware NSXの設定

NSXの設定画面を開き、「ネットワーク」>「接続済み Amazon VPC」>「IPv4 S3 サービス」が有効になっていることを確認します。
無効になっている場合、変更するとコンピュートワークロードなどで利用している際に支障を来す場合があるため、注意して変更してください。

8. Content Libraryを登録

vCenter (vSphere Client)にログインして、コンテンツライブラリを登録します。

左上のハンバーガーメニューから、「コンテンツライブラリ」>「作成」と進みます。

コンテンツライブラリ名を入力し、次へ進みます。

前手順でS3バケットに生成されたlib.jsonのURLを貼り付けます。

初回接続時にはSSL サムプリントの確認が入りますので、「はい」をクリックします。

セキュリティポリシーを適用すると、ファイルをデータストアにインポートする際に逐一検証が走ります。

ストレージはWorkloadDatastoreを選択します。
FSxNをデータストアとして利用している場合は、追加で表示されるためそれを選択しても問題ありません。

「完了」をクリックして登録を完了します。

正常に同期されれば、アイテムが読み込まれます。

isoフォルダに格納しているため、そのサイズが表示されています。

実際にWorkloadDatastoreを確認すると、.isoファイルがダウンロードされ使える状態になっていました。
これをそのまま仮想マシンにマウントして、インストールを行うなど自由にできます。

おわりに

今回はS3バケットにデータを保存し、VPC Endpoint経由でvSphere側からファイルを取得する方法を試してみました。
ファイルを常に同期せず、必要なタイミングのみダウンロードする方式もあるため、これを使ってデータストアの容量を抑えることが可能です。

また、複数のSDDCがある場合や、頻繁にSDDCを立て直す場合はISOなどのデータをオフロードしておくと大変便利です。
是非一度お試しください。

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

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

参考