Alibaba Cloudでだって
テスト駆動インフラ構築したい
1
@mosuke5
AliEaters Tokyo #20 (2021/12/17)
自己紹介
2
名前 もーすけ (@mosuke5)
仕事 Red HatでKubernetesやDevOpsに関するお仕事とか
→顧客にクラウドネイティブな組織になってもらうことを支援
それまで Alibaba Cloudの日本リージョンの立ち上げ・運営
(いちおう初代MVP)
モバイルネットワークの監視システムの開発・運用
Webアプリケーションエンジニア
最近のこと OpenShiftの書籍を書きました。22/1/19発売。
600ページ超の筋トレ道具です
ブログ https://blog.mosuke.tech
2020年のいまごろといえば…
MVPとしての活動がなく、
剥奪されまいと必死
3
しかし、
2021年のもーすけは違う!
4
2021年のAlibaba Cloudとぼく
そして2021年、個人事業主としてAlibaba Cloud & コンテナに関するお仕事をしていた
こともあり、夏頃からいろいろと検証&実作業をしてきた。
具体的には、とある日本のAWSで動作しているアプリケーションを、中国展開用に中
国リージョンで、Kubernetesを用いて構築すること。
5
構築にあたっての課題
1. 検証は日本リージョン、本番は中国リージョンで構築したい。
けど、リージョン固有の問題をテストしておきたい
○ 構築はTerraformを使って自動化する
○ 検証環境は、レイテンシーの都合もあり、日本リージョンを使いたい
○ 現実、リージョン固有の差がある。
例えば、Zoneの数、サービス毎の提供 Zoneの違い、リージョンごとで提供できるスペックの違い
など
2. サービス間の連携をテストしておきたい
○ Alibaba Cloud上でKubernetesを使う場合(とくにServerless Kubernetes)、単一のサービスだけ
では完結せず、さまざまなサービスと組み合わさって動かす。各サービスが起動していることはわ
かるのだが、サービス間が期待通りに連携して動作するかどうかは動かしてみないとわからな
い。
6
課題の例
1. Zone
○ 日本リージョン:ap-northeast-1a,b
○ 上海リージョン:cn-shanghai-a,b,c,d,e,f,g,k,l,m,n
2. RDSの multi-AZ (mariaDB)
○ 日本リージョン:A&B
○ 上海リージョン:B&G, B&L, G&L
3. MongoDBのmulti-AZZ
○ 日本リージョン:シングル AZしか選べない
○ 上海リージョン:シングル AZしか選べない
○ Shenzhenリージョン:A&B&C, C&D&E
7
8
8
VPC
Elastic IP
(NAT GW)
NAT GW
SLB
for API Server
(Port 6443)
Kuberntes
API Server
(Managed)
kubectl get xxx
ENI
Classic NW
SLB
for Ingress
(Port 80,443)
Virtual Node
https://xxxx/
管理
Ingressは、SLB Ingressか
Nginx Ingressが選択可能
PodをECIで起動
Pod A Pod B
ENI ENI
ENI
vswitch (Private Subnet)
LogService
コンテナからインターネット
へはNAT GWを通って出る
名前解決
Kubernetes外の
マネージドサービスと
たくさん連携
Terratestでテスト駆動インフラ構築をする
Terratestは、Gruntworkが提供しているOSSで、インフラのテスティングライブラリです。もとは、
Terraformで構築後のインフラテストのために作られたが、発展して
Kubernetes環境など応用がさ
れている。
https://terratest.gruntwork.io/
9
<対応プラットフォーム>
● AWS
● GCP
● Azure
● Docker
● Kubernetes
● …
Golangのライブラリなので問題なし
package test
import (
"github.com/aliyun/alibaba-cloud-sdk-go/services/vpc"
"github.com/gruntwork-io/terratest/modules/terraform"
"github.com/stretchr/testify/assert"
)
func TestKubernetesHelloWorldExample(t *testing.T) {
…
client, err := vpc.NewClientWithAccessKey(
"ap-southeast-1",
os.Getenv("ALICLOUD_ACCESS_KEY"),
os.Getenv("ALICLOUD_SECRET_KEY"))
…
response, err := client.DescribeSnatTableEntries(request)
…
assert.Equal(t, 3, len(response.SnatTableEntries.SnatTableEntry))
}
10
テスト駆動インフラ構築
11
失敗する
テストを書
く
テストを満
たすコー
ドを書く
リファクタ
リングす
る
失敗するTerratestを書く
テストを満たす、
Terraformコード or
Kubernetesマニフェス
トを書く
リファクタリングする
基本的にはソフトウェア開発の
テスト駆動開発(TDD)と同じサ
イクルで実施する。
ただし、ソフトウェアテストよりテ
ストに時間がかかるので、毎度
作り直しはきつい。
まとめ
● クラウドインフラの構築における課題点がある
○ リージョン固有の問題
○ マネージドサービスの組み合わせが大量
○ テストがしんどい
● モジュールが用意されていないAlibaba CloudでもTerratestでテストを書
くことは別に難しくない
● テスト駆動でのインフラ構築は気持ちがいい
● (ぜひ、Alibaba Cloudの構築&コンテナ関連でお困りならご相談くださ
い!!笑)
12

20211217 Alibaba Cloudでだってテスト駆動インフラ構築したい