PrivateLinkを使って閉域から仮想マシンをEC2へ移行する

S3とEC2のPrivateLinkを使ったパターンでVM Importしてみました。
2021.05.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

前回以下の記事で仮想マシンをVM Importの機能を使ってEC2へ移行してみたのですが、今回はDirect Connectで接続されているような閉域の環境からPrivateLinkを使って移行してみます。

検証ではDirect Connectを用意することは難しいので、今回はオンプレに見立てたVPCからピアリングした環境で実施してみました。

前提

  • VPC Peering(Direcct Connect)で接続済の環境
  • オンプレに見立てたEC2に予めOVAファイルを配置
  • ※VM Importの要件を満たしたイメージを使用
  • vmimport用のサービスロールは作成済

※詳細な要件については以下ドキュメントを参照下さい。

VM Import/Export の要件 - VM Import/Export

やってみる

それでは早速やっていきます。VPC Peering済でEC2がすでにある環境から実施していきます。

エンドポイント用セキュリティグループの作成

まずはエンドポイントを作成する前にセキュリティグループを作成しておきます。

ピアリング先のCIDRからHTTPS(443)を許可するようにインバウンドルールを設定しましょう。

エンドポイントの作成

ますはS3のエンドポイントを作成していきます。エンドポイントの作成からS3を検索してインターフェース型を選択しましょう。VPCはENIを配置するVPCを選択します。

セキュリティグループは先ほど作成したものを選択してください。

EC2のエンドポイントもインポートする際に必要になるので、同じように作成してください。セキュリティグループはS3と同じものを使用して問題ありません。

S3へOVAファイルのアップロード

S3への疎通確認はオンプレに見立てたEC2へログインして確認していきます。

AWS CLIでは下記のようにエンドポイントURLを--endpoint-urlパラメータとして指定することでアクセスすることができるので、vpce-xxxxxxxxxx-0soxupra.s3.ap-northeast-1.vpce.amazonaws.comに先ほど作成したエンドポイントのDNS 名を入れて実行しましょう。S3バケットの一覧が取得できるはずです。

Amazon S3 and interface VPC endpoints (AWS PrivateLink)

$ aws s3 --endpoint-url https://bucket.vpce-xxxxxxxxxxxxx-xxxxxxx.s3.ap-northeast-1.vpce.amazonaws.com ls

問題なくバケットの一覧が取得できたら実際にOVAファイルをアップロードしましょう。今回はvmimport-test-centos8.ovaというVMイメージをvm-import-test-bucketというバケット にアップロードしています。VirtualBoxでVMをエクスポートする方法は前回の記事をご覧ください。

$ aws s3 --endpoint-url https://bucket.vpce-xxxxxxxxxxxxx-xxxxxxx.s3.ap-northeast-1.vpce.amazonaws.com cp ./vmimport-test-centos8.ova s3://vm-import-test-bucket
upload: ./vmimport-test-centos8.ova to s3://vm-import-test-bucket/vmimport-test-centos8.ova

もしConnect timeout on/Could not connect to the endpoint URL: ~のようなエラーで実行できない場合は以下の記事を確認してみてください。

ちゃんと到達できているかわからないとき、VPC Reachability Analyzerが使える場合は利用しましょう。どこでうまく通信できていないかを可視化することができてとっても便利。

VM をインポート

それでは実際にインポートコマンドを実行していきます。まずはインポートコマンドの前にcontainers.jsonの名前で定義ファイルを作成しておきます。

[
  {
    "Description": "My Original CentOS8",
    "Format": "ova",
    "UserBucket": {
        "S3Bucket": "vm-import-test-bucket",
        "S3Key": "vmimport-test-centos8.ova"
    }
  }
]

これで準備が整ったのでインポートコマンドを実行します。PrivateLink経由でAPIが実行できれば、すぐにJSONでレスポンスが返ってくるはずです。

$ aws ec2 import-image --description "My CentOS8 OVA" --disk-containers file://containers.json --endpoint-url https://vpce-xxxxxxxxxxxxx-xxxxxxx.ec2.ap-northeast-1.vpce.amazonaws.com
{
    "Status": "active",
    "Description": "My CentOS8 OVA",
    "SnapshotDetails": [
        {
            "UserBucket": {
                "S3Bucket": "vm-import-test-bucket",
                "S3Key": "vmimport-test-centos8.ova"
            },
            "DiskImageSize": 0.0,
            "Description": "My Original CentOS8",
            "Format": "OVA"
        }
    ],
    "Progress": "1",
    "StatusMessage": "pending",
    "ImportTaskId": "import-ami-xxxxxxxxxxxxx"
}

しばらくすると、AMIがコンソールに作成されました。

あとはこのAMIからEC2を作成すれば移行完了となります。

まとめ

今回はDirect Connect環境を想定してPrivateLinkを使用したVM Importを試してみました。パブリックなネットワークへ接続できる時と比較して、VPCにエンドポイントを作成、S3とEC2へのAPI実行時にエンドポイントのURLを指定するところが大きく変わるため注意しましょう。