Amazon ECSコンテナ #SaaS :イメージをpush!

AWS

2023.10.17

Topics

はじめに

こんにちは、プロダクト推進部のFeelです。
システムをSaaS化するにあたり、必ず考慮すべき部分はコストではないかと思います。AWSもクラウドのユーザーがコストについて多く懸念を持っていることを把握していて、その対案としてSaaS化を推進する上で、サーバーレスやコンテナ化を利用してコストダウンを実現する多くのベストプラクティスを提供しています。本日はその中からAWSの代表的なコンテナサービスであるECSについて簡単に調査し、POCの一環としてdockerfileを生成してECRにイメージをプッシュする過程までを説明してみようと思います。

ECSとは

Elastic Container Service(ECS)は、AWSが提供するコンテナオーケストレーションサービスです。 ECS を使用して、Amazon EC2 インスタンスのマネージドクラスターまたは AWS Fargate 経由のサーバーレス環境でアプリケーションを簡単に実行できます。つまり、コンテナを一つ一つ構成して管理したものをECSというコンテナ用プラットフォームで総合的に管理運用が可能になったと考えるのが良いアプローチ方向ではないかと思います。

ECS環境構築

■VPC生成

まず、インスタンスを使用するためにネットワーク環境を作成する必要があるので、ECSvpcという名前でvpcを作成します。

イメージのようにパブリックサブネットとプライベートサブネットを作成します。

それぞれの設定をする際、上記の設定メニューで1、2の利用可能な設定を別々にします。public_sub1、private_sub1はアベイラビリティーゾーン1aに設定して、public_sub2、private_sub2はアベイラビリティーゾーン1cに設定します。

ルーティングテーブルのタブをクリックすると、デフォルトで作成されたルーティングテーブルがあります。 このルーティングテーブルには「public-rt」という名前としpublic_sub1、public_sub2を設定しておきます。 そして、ルーティングテーブルをもう1つ生成し、名前は「private-rt」とし、private_sub1、private_sub2を設定します。

その後、インターネットゲートウェイを作成します。 「VPCに接続」をクリックしてECSvpcを選択します。

ルーティングテーブルの「public-rt」のルート編集でインターネットゲートウェイを追加します。

次に、セキュリティグループを3つ作成する必要があり、
最初に docker をインストールしdockerfile を作成する EC2 が必要なため、EC2 に対するセキュリティグループを作成します。インスタンスのターミナル作業以外は特に必要ないので、sshだけをオープンします。二つ目のECSコンテナを作成する際は、ロードバランサーに設定するため、ロードバランサーのセキュリティグループも作成します。最後に、コンテナのセキュリティグループを設定します。 コンテナの場合、プライベートサブネットに配置するので、外部からアクセスできない状況です。 そのため、ロードバランサーを介して入るようにソースをロードバランサーセキュリティグループに設定します。

docker環境の構築

それでは、EC2インスタンスを作成し、dockerfileを作成する作業まで試してみます。

■EC2インスタンスの作成

「インスタンス」タブをクリックし、「インスタンスの起動」ボタンをクリックします。

リストの中で最初に表示されるAmazon Linuxを選択します。今回作成しているEC2ではdockerだけを扱うつもりなので、インスタンスタイプはデフォルトで設定されているt2.microを選択し、

ネットワークはECSvpcを選択、サブネットはpublic_sub1を選択し、パブリックip自動割り当てを有効にします。 ストレージはデフォルト値を確認して進みます。 セキュリティグループは先ほど生成したものを設定し、インスタンスを起動します。 そして、生成したEC2に入り、sshで接続を行います。

■dockerのインストール

dockerをインストールして、実行します。 そして「docker images」コマンドで docker が正常にインストールされているのを確認します。 (dockerのインストール手順は省略)

docker imagesのコマンドを入力し、上記のイメージのような画面が表示されましたら、正常にdockerがインストールされているということになります。

■dockerfileの作成

dockerfile-folderという作業フォルダを作成し、下記のようにシンプルなindex.htmlファイルを生成してみます。
[hello NHN Techorus AWS ECS!]

その後、vi dockerfileでdockerfileを作成します。

dockerfileの場合は、nginxをベースにして、先ほど作成したindex.htmlをコンテナのnginx / htmlフォルダにコピーします。 ポート番号は80番に設定し、CMDでnginxを実行させます。


そして、docker buildコマンドでdockerfileをビルドします。

docker imageが作成できたことが確認できます。 ECRでイメージをプッシュする前に、現在、作成したdocker imageが正常に動作しているかをテストしてみます。

create コマンドでコンテナを作成します。 内部ポートの場合は80番ポートを使用していますが、ホストに公開するポートは8000番に設定します。 引き続きコンテナIDを確認し、startコマンドでコンテナを実行します。 さらに、EC2セキュリティグループで8000番ポートを開く必要があります。

その後、正常にWebページが出力されていることが確認できます。(テストページは以降不要なため削除します)

ECR リポジトリ 作成

ECSで「リポジトリ」をクリックし、「リポジトリの作成」ボタンをクリックします。

リポジトリ名は docker image と同じ名前に設定し、リポジトリを作成します。

作成が完了したら、上記のようにコンソールから生成されているリポジトリを確認できます。

EC2でプロファイルを設定

ECRにイメージをプッシュするには、EC2インスタンスでaws configure設定が必要です。 EC2でAWSのリソースを使用するために必要な資格証明として認識していただければと思います。

  • aws configure list

コマンドを入力すると、何も設定されていないことが確認できます。 その後、資格証明のためにEC2上にcredentialsファイルの生成が必要ですが、ファイル生成のためには必ずアクセスキーが必要になるため先にアクセスキーを発行します。

IAMコンソールに移動するとアクセスキーを確認することができますが、既存のものがなかった場合は生成する必要があります。

アクセスキーを使用する用途に合わせて選択します。AWS ECSという単語が書いてある3番目を選択しました。

進行するとアクセスキーとシークレットキーを獲得できます。 ただし、このステップを過ぎるとこれ以上コンソールからシークレットキーを確認することができないので、CSVファイルにダウンロードして安全なところに保存することをお勧めします。上記イメージには表示されていませんが、右下にCSVにダウンロードのボタンが表示されます。アクセスキーの発行が完了すると、EC2インスタンスで次のようにcredentialsファイルの生成に進むことが可能です。

ECRへのdocker imageプッシュ

上記で作成したECR に入り、「プッシュコマンドの表示」ボタンをクリックします。
クリックすると、下記のイメージが画面に表示されます。

2のdockerfileビルドはすでにやったので、残りの1、3、4を実行します。

上記のようにCLI環境でそのままコピー貼り付けをすれば終了です。

最終的にリポジトリをクリックしてみると、上のようにCLI環境でビルドしたdockerイメージがプッシュされたことが確認できます。

まとめ

SaaSにて、コンテナベースの配布が可能になったことにより、条件に応じて単一のインスタンスで複数のテナントアプリケーションに対して運用配布も可能になりました。同時にSaaS運営者の悩みであるコスト削減についても、一つの方法の提示が可能になりました。 Amazon EC2 Container Service(Amazon ECS)は、Dockerコンテナベースのデプロイを容易に設定・管理することに役立ち、個別のコンテナにテナント別のソリューションコンポーネントをデプロイすることが可能です。まず、本日はECSのリポジトリにイメージ化したアプリケーションをプッシュするまでを行ってみました。次のステップとして配布するクラスターの生成とTask definitionを構成について触れる予定です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら