みなさん、こんにちは。昨日に引き続き、ECRとECSを使ってNginxのページを表示させてみましょう。

ECRにリポジトリを作成し、DockerイメージをPushする

次にAWSの操作ですが、今回はAWS CLIを用いて作業を行います。

お使いの環境に合わせてawsコマンドが使えるよう、ご準備下さい。

$ aws ecr create-repository \     –repository-name nginx-ecs \     –region ap-northeast-1

これは「ap-northeast-1」リージョンに「nginx-ecs」というリポジトリを作成するコマンドを意図しています。

コマンド実行後、リポジトリの情報が返ってきたら成功です。

$ aws ecr get-login-password –region ap-northeast-1 \     | docker login –username AWS –password-stdin \     {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

次にdockerコマンドを利用してリポジトリにPushするための設定を行います。

アカウントIDが不明な場合、リポジトリ作成時に返却された「repositoryUri」の値に含まれているのでそれを見てコマンドを変更して下さい。

$ docker tag nginx-ecs:latest \     {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-ecs:latest $ docker push {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-ecs:latest

先程作成したDockerイメージをタグ付けし、ECRにプッシュするコマンドを実行します。

$ aws ecr list-images –repository-name nginx-ecs

作成したリポジトリにイメージが存在することを確認したら、いよいよECSを操作します。

ECSを使ってECRにpushされたイメージを利用したサービスを立ち上げる

ECSの操作は突き詰めると複雑なため、ここから一時的にWebの画面を使って操作を行います。

AWSコンソール上部の検索ボックスに「Elastic Container Service」と入力してECSの画面に移動した後、左部メニューの「クラスター」から「クラスターの作成」ボタンをクリックします。

クラスターテンプレートの選択で「ネットワーキングのみ」を選択し、クラスター名を「nginx-ecs」としてダイアログを完了させます。

次に左部メニューの「タスク定義」から「新しいタスク定義の作成」ボタンをクリックします。

  • 起動タイプの互換性の選択→Fargate
  • タスク定義名→task-nginx-ecr(任意)
  • タスクロール→なし
  • タスクメモリ (GB)→0.5GB
  • タスク CPU (vCPU)→0.25vCPU
  • コンテナの定義→コンテナの追加(後述)

他はデフォルトで大丈夫です。

コンテナの定義では、先程作ったECRのリポジトリ名とタグ名を組み合わせて、次のように入力します。

  • コンテナ名→nginx-ecs(任意)
  • イメージ→{アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-ecs:latest
  • メモリ制限→ソフト制限 128MB
  • ポートマッピング→80 tcp

他はデフォルトで大丈夫です。

この後、IAMロールにecsTaskExecutionRoleがあることを確認し、「AmazonEC2ContainerRegistryReadOnly」をアタッチします。

このポリシーが無いとECS操作時にECRからDockerイメージをPullできずにエラーが出るのでご注意下さい(ECSも結構雑なエラーを出してくるので問題の切り分けが実は難しかったりします)。

タスク定義が完了した後、ECRのクラスターの画面に戻り、「デプロイ」ボタンをクリックして、ダイアログでは次のように入力します。

  • アプリケーションタイプ→サービス
  • ファミリー→先程作ったタスク定義を選択
  • サービス名→service-nginx-ecs(任意)
  • ネットワーキング→必要に応じてVPCを作成し、パブリックなサブネットを指定して、セキュリティグループはインバウンドルールでTCP:80が開放されているものを選択

デプロイするVPCを選択する所だけ少々手間が掛かります。

お使いのアカウントで本番運用しているVPCが存在する場合、そこに誤って混ぜてしまわないよう注意して下さい。

タスク作成後、数分間休憩して戻ってみるとタスクの作成が完了していると思います。

「サービス名→設定とタスク→タスク→ネットワーキング」の順でクリックすると「パブリックIP」の項目に立ち上がったFargateのIPアドレスが表示されます。

IPアドレスをコピーしてブラウザで開いて、作ったhtmlが表示されたのを確認してハンズオン終了です。お疲れ様でした。

作ったリソースはクラスター画面からサービスを削除後、「クラスターの削除」ボタンから削除できます。

今回立てたFargateは少ないリソースなので課金額も僅かですが、消し忘れると課金され続けてしまうのでご注意下さい。

まとめ

いかがでしたでしょうか。

今回はNginxを用いた簡単なDockerイメージの構築からECSを使ったデプロイまでの手順をご紹介しましたが、ハンズオン形式という事で沢山の手順を省略しながらご説明した通り、ECSには構築に関する多彩なオプションがあります。

コンテナの前段にロードバランサーを設置したり、一連のオペレーションをCloudFormationでコード化したり……等、ECSで構築されたアプリケーションを実運用に乗せるためにはこの記事で紹介しきれなかった数多くの設定を行う必要がありますが、今回のハンズオンを通じてECRやDockerを利用したエッセンシャルなECSの活用法について理解が深まれば幸いです。