VPN経由でS3からOSSへのマイグレーション

こんにちは、SBクラウドのKSです。
最近はあまり新しいプロダクトのリリースがなかったので、過去に投稿した記事について少し追加のお話です。

以前ご紹介した「VPNや専用線経由でオブジェクトストレージへアクセスする方法」はAWSのEC2からVPN経由でのOSSのアクセス方法についてですが、これに少し追加する形でAWSのS3からVPN経由でのAlibaba CloudのOSSへのデータコピー方法をご紹介します。

はじめに

OSSへのデータのインポート方法としてはOSSimportというツールがありますが、VPN経由での通信はサポートされていないので、前回の記事の内容を応用します。

ちなみにOSSimportを用いたマイグレーションはこちらの記事で紹介されています。

構成

まずは今回実施したい構成です。

最終的には上記の構成でECSからAWS CLIのコピーコマンドでデータを移行しますが、下記の点がポイントになります。

  • ECSからS3へのアクセスはEC2のsquid(proxy)経由で接続する
    ※インターネットではなくイントラネットでS3へ接続するには、AWSリソースからしかアクセスできないため、Alibaba CloudのECSからの通信をsquidでEC2からのアクセスのように見せています
  • ECSからOSSへのアクセスはossfsを使ってECSのローカルファイルシステムのようにマウントして、AWS CLIのコピー先とする

VPN接続

AWSとAlibaba Cloudの東京リージョンにVPCを作成後、こちらを参照してAWSとAlibaba CloudをVPNGatewayを用いてVPN接続しています。

AWS側の設定

①S3の準備

AWS東京リージョンにS3バケットを用意して、テストデータを配置します。
バケットのアクセス権は「パブリックを許可しない」にしています。

②EC2の準備

VPN接続済みのVPCにEC2を配置します。
proxy通信のため、セキュリティーグループの設定はソースがAlibaba VPCのセグメントに対してTCP3128を許可にします。
また、ルートテーブルは設定のため操作端末のIPアドレスのみインターネットゲートウェイに向けています。

次にEC2にproxy環境を作成するためにsquidをインストール/設定します。

# sudo yum install squid
# sudo chkconfig squid on
# sudo service squid start
# sudo vi /etc/squid/squid.conf
acl localnet src xxx.xxx.xxx.xxx/24  #Alibaba Cloud VSwitch CIDERを追加

:wq

# sudo service squid restart

③VPCエンドポイントの設定

EC2からS3にインターネットを経由せずアクセスするため、VPCエンドポイントを作成します。

①VPCのメニューから「エンドポイントの作成」をクリックします。

②エンドポイントの作成画面でサービス「com.amazonaws.ap-northeast-1.s3」を選択し、VPN接続しているVPCを選択してルートテーブルにチェックを入れて、エンドポイントの作成をクリックします。



③「閉じる」をクリックします。

④作成したエンドポイントのステータスが使用可能となっていることを確認します。

Alibaba Cloud側の設定

①OSSの準備

Alibaba Cloud東京リージョンにOSSバケットを用意します。
バケットのACLは「非公開」にしています。

②ECSの準備

VPN接続済みのVPCにECSを配置します。
(OS利用分以外にデータのキャッシュが一時的に発生するため)システムディスクはコピーデータサイズ+5GB以上を用意しています。
proxy通信のため、セキュリティーグループの設定はソースがAWS VPCのセグメントに対してTCP3128を許可にします。

ECSを準備したら、S3へアクセスするためにAWSのコマンドラインツールをインストールして、コンフィグを設定します。
(現状ではECSからS3へのアクセスはインターネット経由です)

# pip install awscli
Collecting awscli
Downloading http://mirrors.aliyun.com/pypi/packages/c0/
…
Successfully installed awscli-1.16.45 botocore-1.12.35 colorama-0.3.9 docutils-0.14 futures-3.2.0 jmespath-0.9.3 pyasn1-0.4.4 python-dateutil-2.7.5 rsa-3.4.2 s3transfer-0.1.13 six-1.11.0
# aws --version
aws-cli/1.16.45 Python/2.7.5 Linux/3.10.0-693.2.2.el7.x86_64 botocore/1.12.35
# aws configure
AWS Access Key ID [None]: AWSアクセスキー
AWS Secret Access Key [None]: AWSシークレットキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
# aws s3 ls
2018-10-30 10:31:50 vpn-test-to-oss

次にOSSをECSにマウントさせるため、ossfsをインストールして設定します。
(test.txtを事前にOSSにアップロードしています)

# wget https://github.com/aliyun/ossfs/releases/download/v1.80.5/ossfs_1.80.5_centos7.0_x86_64.rpm
# yum localinstall ossfs_1.80.5_centos7.0_x86_64.rpm
# vi /etc/passwd-ossfs
OSSのバケット名:Alibaba Cloudアクセスキー:Alibaba Cloudシークレットキー

:wq

# chmod 640 /etc/passwd-ossfs
# mkdir mountpoint
# ossfs OSSのバケット名 mountpoint/ -ourl=oss-ap-northeast-1-internal.aliyuncs.com -o multipart_size="1000"
# ls mountpoint/
test.txt

マウントのオプション(-o multipart_size=”1000″)は100GB以上のデータをやり取りする際は必要ですが、それ以下では特に付ける必要はありません。
(OSSのマルチパートアップロード機能による1つのパーツサイズを1000MBに指定することで、1オブジェクト10000パーツまでの制限を回避します)

実行

ECS上でAWS CLIのコピーコマンドを用いて、S3からOSSにVPN経由でデータをコピーします。

ECSで実行するAWS CLIの向き先をインターネットではなく、VPNで接続したEC2経由にするため、環境変数に追記します。
※exportで設定した環境変数はログアウトすると消えます

# export HTTP_PROXY=EC2のプライベートIPアドレス:3128
# export HTTPS_PROXY=EC2のプライベートIPアドレス:3128

データをコピーします。

# aws s3 cp s3://vpn-test-to-oss/dummy10GiB.txt mountpoint/

上記はS3のvpn-test-to-ossバケット内にあるdummy10GiB.txtをマウントされているOSSへコピーしています。

EC2でsquidのアクセスログを確認します。

# sudo tail /var/log/squid/access.log
1541636356.549   8271 ECSのプライベートIPアドレス TCP_TUNNEL/200 4239 CONNECT vpn-test-to-oss.s3.ap-northeast-1.amazonaws.com:443 - HIER_DIRECT/52.219.68.48 -

aws s3 cpコマンドが完了していてエラーが表示されていないことを確認します。
※コピーするファイルサイズによってはセッション切れになってしまうため、その場合はscreenコマンドなどで回避してください

# aws s3 cp s3://vpn-test-to-oss/dummy10GiB.txt mountpoint/
download: s3://vpn-test-to-oss/dummy10GiB.txt to mountpoint/dummy10GiB.txt

コピー先のOSSにログインして、OSSへのアップロードが正常に行われたかを確認します。

OSSへのアクセスがインターネット経由ではなくイントラネット通信になっていることは「CloudMonitor」や「OSSの基本データタブ」からも確認できます。


今回は割愛しますが、AWSのEC2からS3へのアクセスはルートテーブルでインターネットに出ないように設定しています。別途S3のバケットポリシーを設定することで、イントラネット(VPCエンドポイント経由)からのアクセスのみを許可にしても今回の構成でS3からOSSへデータコピーが可能です。

さいごに

S3からOSSへのデータコピーはOSSimportというツールがありますが、現状VPN越しには使えません。インターネット経由ではなく、VPNや専用線経由にするためにはいろいろと組み合わせて今回のような方法が必要になります。

いずれOSSimportがVPNに対応するかもしれませんし、または新しいプロダクトが登場するかもしれません。そのような機能がリリースされないかなぁと願っています。

この記事をシェアする