IBM Cloud x Amazon ECS Anywhereでマルチクラウド

この記事は [IBM Cloud Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ibmcloud) の 12日目の記事です。

#やってみたこと
今年はAWS Educateを大学に導入し、クラウドコンピューティングを主とした科目の授業をスタートさせることができました。IBM Cloudは以前から使っていますので、今回はAWSとIBM Cloudのマルチクラウドにチャレンジしてみます。

2021年6月に正式リリースされました「AWS ECS Anywhere」を使い、IBM Cloud上の仮想サーバーを「Externalインスタンス」として認識させ、「Metabase」のコンテナを実行します。「Metabase」は、オープンソースのローコードのBIツールで、直感的なデータ分析を行うことができます。
AWSとIBM Cloudの両方を使っていて、コンテナを使ったアプリケーション運用を行っていれば、Amazon ECS AnywhereをIBM Cloudで使う組み合わせは意外と悪くない選択肢かもしれません。

##構成イメージ
![Untitled Diagram.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/54b1c994-8b32-09b6-5834-3ac8b938a357.png)

# 使用環境の準備
## IBM Cloud
IBM Cloud 上で仮想サーバーを用意します。「Virtual Server for VPC」もしくは「Virtual Server for Classic」のどちらでも構いません。金銭的に安い方は、「Virtual Server for Classic」で「一時」利用のサーバーです。今回は、2 vCPU、メモリ8GBのUbuntu Serverを使っています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/b2c71ced-f60d-42be-398b-ee8c283250dd.png)|
|:--|

## AWS
いつものAWSです。教育機関以外の場合は、AWS Management Console にアクセスします。
教育機関の場合は、AWS Educateを使った方が良いでしょう。AWS Educate であれば、クレジットカードなしで利用できます。
AWS Educateの場合は、「AWS Account」のタブをクリックし、「AWS Educate Starter Account」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/9839ff60-9fbd-66bc-704e-0b20506c0f94.png)
その後、「AWS Console」をクリックすることで、通常のAWS Management Consoleにアクセスすることができます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/5ce1894d-101a-5bd1-d542-9fbe46172421.png)|
|:--|

# IBM Cloud をAmazon ECSの「External インスタンス」にする方法
実施することは、次のとおりです。

1. 使用環境の準備の準備の段階で、IBM Cloud上で仮想サーバーを用意しておきます。
1. Amazon ECSで、クラスター作成。
1. Externalインスタンスの登録コードを作成。Amazon ECS Anywhereの利用。
1. 生成されたコードを、IBM Cloud上の仮想サーバーに貼りつけて実行。
1. Amazon ECSで、Meatabaseのコンテナを導入するタスクを作成。
1. Amazon ECSで、タスクを実行。
1. IBM Cloud上の仮想サーバーで、docker ps コマンドでコンテナ起動を確認。
1. Webブラウザで、IBM Cloudの仮想サーバー上で起動したMetabaseコンテナに接続。

## Amazon ECSで、クラスター作成
Amazon ECSにアクセスし、「クラスターの」作成をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/76acf16d-d600-db7b-76e3-e33c57538d56.png)|
|:--|

「ネットワーキングのみ」を選び、「次のステップ」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/0d3c2669-2e85-11d9-cbc1-04cef06a8b4f.png)|
|:--|

「クラスターの設定」で、「クラスター名」を英数字で入力します。今回は、ecs-externalとしました。入力後、「作成」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/b3e2f70a-370c-a432-1b13-2ca2c972c7b2.png)|
|:--|

下図のように表示されます。「クラスターの表示」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/8c79a73a-55f2-99a5-48b6-49cf53b4a426.png)|
|:--|

## Externalインスタンスの登録コードを作成。Amazon ECS Anywhereの利用
「ECSインスタンス」のタブをクリックします。次に「Externalインスタンス」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/e2c0b66c-f984-2387-0713-2f3ffcb8a268.png)|
|:--|

「Externalインスタンスの登録」では、デフォルトのままで良いので、「次のステップ」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/1cc64c2f-3294-6c8b-f8c3-6da750343318.png)|
|:--|

## 生成されたコードを、IBM Cloud上の仮想サーバーに貼りつけて実行
表示されたコマンドをコピーし、IBM Cloud上で稼働する仮想サーバーに貼り付けで実行します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/0e040f74-bf19-e7b4-58f6-4c8210038bf2.png)|
|:--|

IBM Cloud上で稼働する仮想サーバーに、Amazon ECSから生成されたコマンドを貼り付けて実行した様子。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/c1ca3dfa-48a8-837c-1c93-ad5ea916d614.png)|
|:--|

下図のように処理が完了するまで待ちます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/4eb52e61-555b-ccde-c21b-27d643dc05b7.png)|
|:--|

暫く待つと、Amazon ECSのクラスター表示画面に、IBM Cloud上で稼働中の仮想サーバーが紐づきます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/8a756404-a164-c813-f8c6-c95d5bc1fb86.png)|
|:--|

## Amazon ECSで、Meatabaseのコンテナを導入するタスクを作成
Amazon ECSの画面で、「タスク定義」>>「新しいタスク定義の作成」の順にクリックします。「タスク定義」には、動かしたいコンテナを定義、「タスク」を実行することで、Amazon ECSにとってのExternal、今回の構成では、IBM Cloud上の仮想サーバーでコンテナのデプロイをAmazon ECSから行います。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/881611d6-78ca-68ed-75cd-193e7cfa6dbd.png)|
|:--|

「起動タイプの互換性の選択」画面で、「External」を選び、「次のステップ」をクリックします。IBM Cloudだけでなく、Raspberry Piのようなエッジ環境、あるいはオンプレミス環境など、AWS以外の場合は「External」扱いです。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/a06e2be4-73b0-4b33-fc23-1b7389574c34.png)|
|:--|

「タスクとコンテナの定義の設定」で、「タスク定義名」を入力します。ここでは、metabase としました。コンテナで動かしたいアプリケーション名にすると良いでしょう。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/6441429f-53d3-85dc-6ebb-88b9700a116a.png)|
|:--|

また同画面の下に移動し、「タスクメモリ」と「タスクCPU」を定義します。「タスクメモリ」はこの後に設定するコンテナの「メモリ制限」を超えないように、かつ今回の場合はIBM Cloud上の仮想サーバーのメモリを超えない値をセットします。「タスクCPU」も、今回の場合はIBM Cloud上の仮想サーバーを超えない範囲とします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/8aad8da7-2571-59df-ac26-8c910a9e7545.png)|
|:--|

同画面の下にある「コンテナの定義」で「コンテナの追加」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/154bd948-4c56-e385-07c2-9873963d3e58.png)|
|:--|

「コンテナの追加」画面で、下図のように「コンテナ名」を入力します。「イメージ」には、コンテナの取得先を入力します。今回使用するmetabaseは、Docker Hubにイメージがありますが、プライベートレジストリを利用したい場合は、「プライベートレジストリの認証」にチェックを入れます。
また、「メモリ制限」には、「タスク定義」を超えない範囲でメモリを指定するとともに、ポートマッピングでは、metabaseの[公式ドキュメント](https://www.metabase.com/docs/latest/operations-guide/running-metabase-on-docker.html)に従い、ホストポート番号とコンテナポート番号にそれぞれ3000を入力しています。各項目を入力後、「追加」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/ce1ce65c-df44-9145-e505-e2554d1bec1e.png)|
|:--|

画面下の「作成」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/030cef39-6bfe-f66d-af3c-536cf12231bc.png)|
|:--|

## Amazon ECSで、タスクを実行
作成した「タスク定義」が表示されます。表示されない場合は、画面左側の「タスク定義」をクリックし、作成したタスク定義画面にアクセスします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/3238dcd7-66c3-8751-f28c-cd89b5dc7100.png)|
|:--|

「アクション」>>「タスクの実行」の順にクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/891d8ae6-897e-6079-5731-e13cc746b53c.png)|
|:--|

「タスクの実行」画面で、下図のように「起動タイプ」を「External」とします。「タスク定義」には先程作成した「metabase」が選ばれているはずです。「クラスター」には、作成済みのクラスターが選ばれています。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/afae8e08-b0a5-6bfa-e40d-20314783b908.png)|
|:--|

画面下の「タスクの実行」をクリックします。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/ca95accb-9660-992e-2d69-e047995cd417.png)|
|:--|

## IBM Cloud上の仮想サーバーで、docker ps コマンドでコンテナ起動を確認
暫く待つと、IBM Cloud上の仮想サーバーで、コンテナが起動していることがわかります。docker ps コマンドで確認します。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/40c31800-081e-3826-52c9-7c07f0ce72dc.png)|
|:--|

## Webブラウザで、IBM Cloudの仮想サーバー上で起動したMetabaseコンテナに接続
IBM Cloud上の仮想サーバーで、外部からのインバウンドで、TCPで3000番にアクセスできるようにポートを開放します。
Webブラウザで、IBM Cloud上の仮想サーバーのパブリックIP(VPCの場合は、浮動IP)を使いアクセスします。http://IPアドレス:3000 
これで、Amazon ECS Anywhereを用いて、IBM Cloud上でコンテナを実行した結果を確認することができます。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/06b0bcc0-cae2-9199-3547-a591d026984b.png)|
|:--|

「開始しましょう」をクリックし、Metabaseの初期設定を行い、サンプルデータによるダッシュボードも確認できました。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41414/6cdd0c3e-e2d1-d9a5-500e-ecf02b56cd8b.png)|
|:--|

# まとめ
IBM Cloudだけを使う開発者や企業よりも、AWSやMicrosoft Azureを使いつつIBM Cloudも使っているようなマルチクラウド、ハイブリッドな個人や企業が多いわけで、AWSとIBM Cloudについて、AWSとIBM Watsonの定番構成ではなく、Amazon ECS AnywhereとIBM Cloudの連携に手を出してみたところ、割と簡単に実現することができました。案外、悪くありません。