こんにちは、SBクラウドのKSです。 最近暑い日が続いておりますが、そんな暑さを吹き飛ばす、、、とまでは言いませんが、オブジェクト・ストレージ・サービス(以下OSS)へのセキュアなアクセス方法をご紹介します。
はじめに
オンプレミス環境や他社パブリッククラウドからOSSへデータを移行したい!といった要件や、マルチクラウドでOSSを利用したい!などの要望がある場合、インターネット経由だとセキュリティに不安があるかと思います。
セキュアにOSSアクセスを実現するために、お手軽に実現できるのがVPN接続でのイントラネット通信になりますが、実は拠点間をVPN接続するだけではOSSとのイントラネット通信を実現することはできません。 OSSへのアクセスは、同一リージョン内であれば自由にイントラネット通信が可能ですが、同一リージョン以外との通信は、インターネット経由になります。
冒頭に記載したような、オンプレ、他クラウド事業者からの通信をイントラネット経由で通信させるには、今回ご紹介する事例のように一工夫必要になります。
今回の事例では、AWS EC2→VPN接続→ECS→OSSと言う流れで、ECSでリクエストを中継する事で、OSSへのイントラネット通信を実現します。 OSSのイントラネットアドレスは、以下のコンソール画面で確認する事ができ、AWS EC2からECS経由でOSSイントラネットアドレスにアクセスできます。
構成
今回実施した構成です。
作業ステップとしては以下のようになります。 ・VPN接続(AWSとAlibaba CloudをVPN接続) ・ossutilインストール(EC2にOSSを操作するツールをインストール) ・stoneインストール(中継点のECSからOSSへ通信を転送するツールをインストール) ・hostsへの追記(hostsの名前解決を用いて、EC2からECSへossutilの通信を中継) ・確認(VPN経由でのOSSのバケット確認とファイルのアップロード)
それぞれ順番に説明して行きます。
VPN接続
Alibaba CloudとAWSのVPN接続は過去に別のブログ掲載がありますので、こちらの記事を参照しています。(上の構成図とかはほとんどそのまま使わせていただきました。MIさんすみません。)
今回はこの通りにVPN接続してますが、追加項目としてはセキュリティグループの設定で、ossutilの通信を通すために中継点となるECSへの80ポートの通信を許可にしています。
ossutilインストール
AWSのEC2からOSSを操作するために、「ossutil」というコマンドラインツールをインストールします。 ossutilの詳細はこちらをご参照。
ossutilの設定でエンドポイントはイントラネットを指定します。
# ossutil -L EN config The command creates a configuration file and stores credentials. ・ ・ ・ Please enter language(CH/EN, default is:CH, the configuration will go into effect after the command successfully executed):EN Please enter endpoint:【イントラネットのエンドポイント】 Please enter accessKeyID:【アクセスキー】 Please enter accessKeySecret:【アクセスキーシークレット】 Please enter stsToken:【リターン】
stoneインストール
ECSにフリーソフトウェアであるstoneをインストールします。 stoneとは、、、アプリケーションレベルの TCP & UDP パケットリピーターで、TCP パケットあるいは UDP パケットを中継します。 他のホストの特定のポートへ中継することができます。 stoneの詳細はこちらをご参照。
# cd /usr/local/src # wget http://www.gcd.org/sengoku/stone/stone-2.3e.tar.gz # tar zxvf stone-2.3e.tar.gz # cd stone-2.3d-2.3.2.7 # vi Makefile linux: $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone ↑「-D_GNU_SOURCE」を追加 # make linux ※エラーが出なければOK # mv stone /usr/bin/ # ln -s /usr/bin/stone /usr/local/bin/stone # cd .. # rm -fr stone-2.3d-2.3.2.7
hostsへ追記
AWSのEC2のhostsファイルに追記します。 内容はOSSのイントラネットエンドポイントと経由するECSのプライベートアドレスの組み合わせです。 OSSのバケット内にアクセスするため、バケット名+イントラネットエンドポイントと経由するECSのプライベートアドレスの組み合わせも入れています。
# vi /etc/hosts 172.31.10.171 oss-ap-northeast-1-internal.aliyuncs.com 172.31.10.171 aws-alibaba-oss.oss-ap-northeast-1-internal.aliyuncs.com
確認
中継サーバーのECSでstoneを起動します。 (アクセスログを確認するためデバックモードで起動) 80番ポートに来たリクエストをOSSのイントラネットエンドポイントに同じポートで流すようにしています。
# stone -d -d oss-ap-northeast-1-internal.aliyuncs.com:80 80
EC2からossutilでOSSにアクセスします。
# ossutil ls CreationTime Region StorageClass BucketName 2018-07-13 04:49:47 +0000 UTC oss-ap-northeast-1 Standard oss://aws-alibaba-oss Bucket Number is: 1 0.130188(s) elapsed # ossutil ls oss://aws-alibaba-oss LastModifiedTime Size(B) StorageClass ETAG ObjectName 2018-07-13 05:30:27 +0000 UTC 378 Standard 9A63BDEBD987F5A47DAAC8F09F2A2A42 oss://aws-alibaba-oss/test.txt Object Number is: 1 0.078061(s) elapsed
ECSには下記のように表示されます。 (from 10.0.10.30というのがEC2のプライベートアドレスになります)
Jul 19 08:27:36.474864 140024416536384 stone 3: accepted TCP 5 from 10.0.10.30:37104 mode=0 Jul 19 08:27:39.489235 140024416536384 stone 3: accepted TCP 5 from 10.0.10.30:37106 mode=0
もちろんファイルのアップロードもできます。
# ossutil cp ./test2.txt oss://aws-alibaba-oss Succeed: Total num: 1, size: 3. OK num: 1(upload 1 files). 0.196164(s) elapsed
ちなみにインターネット経由ではなくイントラネット通信になっていることは「CloudMonitor」からも確認できます。
おまけ
今回はhostsファイルの名前解決とstoneによるパケット中継を使いましたが、他にもECSにOSSをマウントさせて、VPNで接続したEC2からプライベートネットワーク越しにOSSに接続するパターンが考えられます。 OSSのマウントに関しては過去にテックブログに掲載されているので、こちらをご覧ください。
# scp ./test4.txt root@172.31.10.172:/mnt/ossfs/ root@172.31.10.172's password: test4.txt 100% 3 0.1KB/s 00:00
上記のようにコマンドを実行することで、EC2にあるtest4.txtをOSSにアップロードできました。 (172.31.10.172はOSSをマウントさせたECSのプライベートアドレスで、/mnt/ossfs/はマウントポイントになります)
さいごに
今回はAWSのEC2からプライベートネットワークでOSSの操作をしましたが、オンプレ環境からもVPN接続やダイレクトアクセスでのプライベートネットワーク経由でOSSへ接続できます。 OSSはAlibaba Cloudの中でも良く使われるプロダクトなので、このような接続方法もあるんだと思っていただけたら幸いです!!