ECSでコンテナを動かしてみる

前回、ECRにコンテナを登録してみました。
ECRにdockerイメージを登録してみる - xdeveloper
今回はECRに登録したコンテナをECSで動かしてみたいと思います。

ECSとは

Amazon Elastic Container Service (ECS) はDockerコンテナの起動、停止、デプロイ、スケーリング、設定を自動化できるフルマネージドなコンテナオーケストレーションサービスです。
これまでコンテナを実行するホストマシン環境は自分で準備する必要がありましたが、ECSを利用するとホストマシン環境を簡単に作成することができます。 またコンテナの起動、停止、デプロイやこれらの自動化もECSより実施することができます。ECSを利用することでコンテナの管理を高品質で効率よく行うことができます。

起動タイプ

コンテナが動作するホストによって起動タイプは「EC2」と「Fargate」があります。
「EC2」はホストマシンがEC2上に作成されます。ホストマシンを複数台作成し冗長化することも可能です。
「Fargate」はホストマシンの管理を完全にAWSに移譲するものです。そのためホストマシンにアクセスすることはできません。 AWSに任せてしまうことでホストマシンに対するセキュリティやリソース状況などの管理を行う必要がなくなります。

f:id:d-akmts:20210225102309p:plain
起動タイプ

タスク/サービス/クラスタ

ECSを利用する上で少なくとも知っておく必要がある3つの用語です。

  • タスク
    コンテナの管理(1タスクに複数コンテナ可)
    コンテナのリソース、環境変数なども設定

  • サービス
    複数のタスクより成り立つ。タスクの起動数の設定。
    ELBやデプロイやオートスケールの方法の設定。

  • クラスタ
    ホストの設定。ホストの種類(EC2/Fargate)
    EC2の場合のインスタンスタイプやインスタンス数など

f:id:d-akmts:20210216135340p:plain
タスク/サービス/クラスタ

ECSでコンテナを起動させてみよう

実際にECSでコンテナを起動してみましょう。
今回は起動タイプをEC2、コンテナは前回作成したApacheのコンテナを利用します。

クラスターの作成

AWSマネジメントコンソールからECSを選択し、メニューのクラスターを選択、「クラスターの作成」ボタンをクリックします。
クラスターテンプレートの選択では「EC2 Linux + ネットワークイング」を選び、「次のステップ」をクリックします。

f:id:d-akmts:20210225104644p:plain
クラスターテンプレートの選択

  • クラスタ名・・・適当な名前を入力
  • EC2インスタンスタイプ・・・t3a.smallあたりを選択。あまりスペックが低いとコンテナが起動できないです。
  • インスタンス数・・・EC2を複数立ち上げたいので2

f:id:d-akmts:20210225110316p:plain
クラスターの作成1

  • キーペア・・・EC2にアクセスしたい場合は適切なものを指定。「なし」でもかまいません。
  • VPC・・・「新しいVPCの作成」を選択

f:id:d-akmts:20210225112643p:plain
クラスターの作成2

  • セキュリティグループ・・・「新しいセキュリティグループ」とし、インバウンドルールには Apacheにアクセスするアクセス元のIPアドレスを指定。
  • ポート・・・80。

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

f:id:d-akmts:20210225112951p:plain
クラスターの作成3

タスクの作成

続いてタスクを作成します。
事前にECRでデプロイしたいリポジトリURIをECRで確認しメモしておきます。
 
ECSのメニューの「タスク定義」を選択、「新しいタスク定義の作成」ボタンをクリックします。
起動タイプでは「EC2」を選択します。

f:id:d-akmts:20210225113511p:plain
タスクの作成1

  • タスク定義名・・・適当な名前を入力
  • ネットワークモード・・・bridge

    f:id:d-akmts:20210225113541p:plain
    タスクの作成2

  • タスクメモリ・・・512

  • タスクCPU・・・512

f:id:d-akmts:20210225113608p:plain
タスクの作成3

「コンテナの追加」をクリックします。

  • コンテナ名・・・適当な名前を入力
  • イメージ・・・ECRで控えたURIを入力
  • ポートマッピング・・・ホストポート「80」、コンテナポート「80」とします  

「追加」ボタンで「コンテナの追加」を閉じます。
画面下の「作成」ボタンをクリックします。

f:id:d-akmts:20210225113754p:plain
タスクの作成4

サービスの作成

サービスを作成します。
 
ECSのメニューの「クラスタ」を選択、先ほど作成したクラスタを選択します。
サービスタブの「作成」ボタンをクリック。

  • 起動タイプ・・・EC2を選択
  • タスク定義名・・・先ほど作成したタスクを選択
  • クラスター・・・先ほど作成したクラスターを選択
  • サービス名・・・適当な名前を入力
  • タスクの数・・・2

画面下の「次のステップ」をクリックします。
以降はデフォルトのまま作成します。

f:id:d-akmts:20210225144348p:plain
サービスの作成

しばらく待つとコンテナインスタンスが2つ起動しているのが分かります。
コンテナインスタンスのリンクをクリックします。

f:id:d-akmts:20210225144234p:plain
タスク

コンテナインスタンスの詳細が分かります。
EC2インスタンスよりコンテナが実行されているEC2のインスタンスが分かります。
パブリックIPに記載されているIPアドレスにブラウザからアクセスしてみます。

f:id:d-akmts:20210225144302p:plain
コンテナインスタンス

コンテナ上で動作しているApacheの画面にアクセスできました。

f:id:d-akmts:20210225150301p:plain
ブラウザからアクセス

AWS CodeCommitを利用する。

CodeCommitとは

Gitを使用したソース管理サービスになります。 CodeCommitを利用することでGitサーバの構築、管理が不要になります。 GitユーザーはIAMユーザー単位で管理することができます。

前提

  • ここでは基本的なCodeCommitの使い方を記載しています。
  • Gitの基本的な知識がある人向けです。
  • GitはHTTPS認証の接続になります。

CodeCommitを利用するまでの流れ

  1. CodeCommitでリポジトリを作成する。
  2. IAMでグループを作成する。
  3. IAMでユーザーを作成する。
  4. 作成したリポジトリをpullする。
  5. 作成したリポジトリにpushする。

CodeCommitでリポジトリを作成する

まずはCodeCommitでリポジトリを作成する手順になります。 サービスからCodeCommitを選択し、メニューのリポジトリを選択し、「リポジトリを作成」ボタンを押します。 f:id:shibue:20210222103803p:plain

次にリポジトリ名を入力して「作成ボタン」を押します。 f:id:shibue:20210222104656p:plain

リポジトリが作成できたことを確認します。 f:id:shibue:20210301095815p:plain

IAMでグループを作成する

リポジトリを作成したらCodeCommit用にグループを作成します。 サービスからIAMを選択し、メニューのグループから「新しいグループの作成」ボタンを押します。 f:id:shibue:20210301140055p:plain

グループ名を入力し、「次のステップ」ボタンを押します。 f:id:shibue:20210301140824p:plain

作成するグループにアタッチするポリシーを選択します。 今回は「 AWSCodeCommitFullAccess」を追加し、「次のステップ」ボタンを押します。 f:id:shibue:20210301144447p:plain

確認画面で「グループの作成」ボタンを押下します。 f:id:shibue:20210301145824p:plain

作成したグループが表示されていることを確認します。 f:id:shibue:20210301150059p:plain

IAMでユーザーを作成する

グループを作成したらCodeCommitを利用するユーザーを作成します。 メニューのユーザーから「ユーザーを追加」ボタンを押します。 f:id:shibue:20210301152337p:plain

ユーザー名を入力し、アクセスの種類は「プログラムによるアクセス」を選択し、「次のステップ:アクセス権限」ボタンを押します。 f:id:shibue:20210301154440p:plain

「ユーザーをグループに追加」から先ほど作成したCodeCommit用のグループを選択し、「次のステップ:タグ」ボタンを押します。 f:id:shibue:20210301154845p:plain

必要があればタグの情報を入力し、「次のステップ:確認」ボタンを押します。 f:id:shibue:20210301155156p:plain

内容を確認し、問題がなければ「ユーザーの作成」ボタンを押します。 f:id:shibue:20210301160558p:plain

ユーザーの作成が成功したらアクセスキーIDやシークレットアクセスキーを保存します。 アクセスキーIDやシークレットアクセスキーは他人に公開しないでください。 次は作成したユーザーを選択し、認証情報を変更します。 f:id:shibue:20210301162045p:plain

認証情報タブから「AWS CodeCommit の HTTPS Git 認証情報」の「認証情報を生成」ボタンを押します。 f:id:shibue:20210301162533p:plain

「証明書のダウンロード」ボタンを押して認証情報をダウンロードします。 認証情報は他人に公開しなくでください。

作成したリポジトリをpullする

サービスからCodeCommitを選択し、メニューのリポジトリを選択し、「URLのクローン」からHTTPSを選択しURLをコピーします。 f:id:shibue:20210302101023p:plain

ターミナルを起動し、コピーしたURLを使用してリポジトリをクローンします。 UsernameとPasswordはダウンロードした認証情報に記載されているものを使用します。 成功すると以下のようなメッセージが表示されます。 f:id:shibue:20210302133143p:plain

作成したリポジトリにpushする

クローンしたプロジェクトにサンプルのファイルを作成し、pushを行います。 f:id:shibue:20210302142154p:plain f:id:shibue:20210302142014p:plain

AWSコンソールのサービスからCodeCommitを選択し、メニューのリポジトリを選択し、作成したプロジェクトを選択します。 f:id:shibue:20210302142909p:plain

先ほどpushしたファイルが追加されていることを確認します。 f:id:shibue:20210302143141p:plain f:id:shibue:20210302143155p:plain

以上が基本的なCodeCommitの使い方になります。

ECRにdockerイメージを登録してみる

今回AWSのECRを利用してコンテナイメージを登録してみたいと思います。
ECRを利用することでコンテナイメージを皆と共有したり、デプロイしたりすることができます。
サンプルとしてApacheのコンテナを準備してやってみます。

ECRとは

Amazon Elastic Container Registry (ECR) はコンテナのイメージを保存・共有できるサービスです。Amazon Elastic Container Service (ECS)やAmazon Elastic Kubernetes Service (EKS)などと連携して保存したイメージからデプロイすることができます。

前提知識

  • dockerの基本的な知識があること

実施した環境

  • CentOS 7.9
  • dockerがインストールされていること(バージョン 20.10.3)
  • aws cliがインストールされていること(バージョン2.1.25)

実行手順

dockerコンテナを準備

まずはApacheのイメージを公式レジストリから取ってきます。

# docker pull httpd

docker imagesでイメージが追加されたのが分かります。

# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
httpd        latest    683a7aad17d3   3 weeks ago   138MB

docker runでコンテナを起動し、ブラウザからhttp://localhostにアクセスすると、It works!と表示されるはずです

docker run -rm -p 80:80 httpd

このイメージをECRに登録します。

ECRにリポジトリを作成

AWSマネジメントコンソールからECRの画面を開きます。
リポジトリを作成」ボタンをクリックします。

f:id:d-akmts:20210210132943p:plain
ECR
可視性設定に「プライベート」を選択、リポジトリ名に「httpd」を入力します。
画面下部の「リポジトリを作成」ボタンをクリックします。
f:id:d-akmts:20210210133658p:plain
リポジトリを作成
作成したリポジトリが一覧に追加されました。
リポジトリを選択し画面上部の「プッシュコマンドの表示」をクリックします。
f:id:d-akmts:20210210134238p:plain
プッシュコマンドを表示
このリポジトリにイメージを登録するためのコマンドが4つ表示されます。
4つのコマンドをメモしておきましょう。
f:id:d-akmts:20210210134550p:plain
プッシュコマンド

リポジトリにプッシュ

メモした4つのコマンドを実行していきます。
1つ目のコマンドでAWSへのdockerクライアント認証を行います。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxx.ecr.ap-northeast-1.amazonaws.com

2つ目のコマンドでビルドします。今回はApacheのイメージをそのままECRに登録するので実施不要です。

docker build -t httpd .

3つ目のコマンドECRのhttpdリポジトリについてlatestというタグ付けを行います。
タグはv1, v2のようにバージョンとすると運用しやすくなります。

docker tag httpd:latest xxx.ecr.ap-northeast-1.amazonaws.com/httpd:latest

4つ目のコマンドで作成したタグをECRにプッシュします。

docker push xxx.ecr.ap-northeast-1.amazonaws.com/httpd:latest

ECRの画面を確認するとプッシュしたタグが追加されているのが分かります。

f:id:d-akmts:20210210145932p:plain
プッシュ後

参考

新人に答えるAWSの基本(1)勉強方法

AWSの良い勉強方法は?

  1. まずは慣れましょう。
    • まずは入門書を読んで用語を覚えましょう。
    • アカウントを作ってコンソールを触ってみましょう。
    • Udemyやハンズオン資料を参考に、VPC, EC2, InternetGWなどを作ってみましょう。
  2. 慣れた後で有料研修を受けましょう。無料で勉強したい人はYoutube公式チャンネルやAWSの無料ラーニングを使いましょう。
  3. Associateクラスの資格を目指してみましょう。

AWSを覚えるための良い教材は?

概要をつかむ為の教材。

入門書

★の数を頼りにamazon.co.jpで適当に探してみてください。 幸いな事に、最近は書籍が豊富です。2019年頃から爆発的に書籍が充実しましたね。

YouTube

YouTubeを活用してみましょう。AWSの公式チャンネルがあります。 例えばAWS再入門といった動画で感覚を掴みましょう。

公式サイトのスライドなど

AWSの代表的なサービスについて概要を掴みましょう。

操作を覚える為の教材。

公式のハンズオン資料

ハンズオン資料を見ながら体験してみましょう。

Udemy

Udemyという動画付きの学習サイトがあります。 AWSの操作画面を動画で表示しながら解説をしてくれるので、取り組みやすいのではないでしょうか? IT系のコースが豊富です。1教材あたり数万円の定価設定がされてますが、セールの時には数千円になる事もあります。

研修や資格の為の教材。

有料研修(Architecting on AWS

Architecting on AWSを学ぶと基本を身に付けることができます。

無料のオンラインラーニング

レーニングライブラリで無料の研修コースがあります。コースが沢山ある反面、どれが最低限必要なのかを判断するのが新人さんには難しいかもしれません。
なるべく会社からお金を出してもらって有料研修を受けるほうが良いと思います。

FAQ

FAQ

サンプル問題

ソリューションアーキテクトアソシエイトのページにサンプル問題がありますので、解いてみましょう。

個々のサービスの概要を知る為の教材。

活用資料集

個々のサービスの概要を知るには活用資料集が有用です。

個々のサービスの仕様を把握する為の教材。

AWSのドキュメント

個々のサービスを知るには、AWSのドキュメントを参照するのが良いでしょう。

設計を知る為の教材。

Well-Architected Framework

Well-Architected Frameworkを見てみましょう。 AWSでインフラを構築する場合の考え方がわかります。

試験準備

AWS 認定のための新しい試験準備コース

その他