ニュース

ニュースに戻る

Dockerを使ったECSへのNodeアプリ展開

2021/05/18tech talk
作成者:briswell vietnam co ltd
Dockerを使ったECSへのNodeアプリ展開

この記事ではNode.jsアプリケーションをビルドし、Amazon Elastic Container Registry (ECR)およびAmazon Elastic Container Service (ECS)を用いてAmazon Web Services (AWS)へ展開することについてお話しします。具体的に言えば、以下のような手順があります。

1) 環境構築

NodeNpmodeについて こちら へアクセスしてから最新バージョンをインストールしてください。

Docker(ドッカー)について こちら へアクセスしてから最新バージョンをインストールしてください。

AWS アカウントについて無料アカウントを登録しておいてください。

AWS CLIについてこちらへアクセスしてから、お使いのOSに応じて手順を行ってください。

2) DockerおよびAWSの概要

Dockerとは、どこへもプッシュし、実行できるコンテナを用いてアプリケーションと依存関係や環境変数をビルドするためのオープンソースソフトウェアをいいます。Dockerではハードウェアやフラットフォームから隔離しているのでコンテナに入るアプリケーションをどんな環境にも独立的に実行することができます。

Amazon Web Services (AWS)は費用のかからない拡張可能かつ安全なクラウドサービスを提供します。前述の如く、この記事ではECRとECSのサービスについてのみお話しします。

3) Node.jsアプリ作成

以下のように展開のためのサンプルアプリケーションを予め作成しておいてください。簡単なNode.jsアプリケーションで良いです。

端末に以下のように入力します。

// 新たなディレクトリー作成
$ mkdir ecs-nodejs-app

// 作成したてのディレクトリーへの移動 
$ cd ecs-nodejs-app

// npm初期化
$ npm init -y

// expressインストール
$ npm install express

// server.jsファイル作成
$ touch server.js

server.jsファイルを開いて、以下のコードをそこにコピー・ペーストします。

// server.js

const express = require('express')
const app = express()

app.get('/', (req, res) => {
res.send('Welcome from a Node.js app!')
})

app.listen(3000, () => {
console.log('Server is up on 3000')
})

以下のコマンドでアプリケーションを起動します。

$ node server.js

ブラウザを開いて http://localost:3000 にアクセスすると、「Welcome from a Node.js app! 」が表示されます。

次の手順でアプリケーションをビルドします。

4) Dockerファイル作成

以下のように、ルートディレクトリーにDockerファイルというユニークなファイルを作成することによりアプリケーションをビルドします。なお、このファイルには拡張子がありません。

FROM node:8-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm install
EXPOSE 3000
CMD [ "node", "server.js" ]

5. Dockerイメージのビルド

Dockerを設定して実行したことを確認してください。今やDockerファイルが作成済なので、以下のようにDockerイメージを「 -t 」コマンドでビルドします。

$ docker build -t ecs-nodejs-app .

6. Dockerコンテナ実行

これまで、Dockerイメージ作成の完了です。作成したDockerイメージを確認するために以下のコマンドを打ちます。

$ docker images

作成したてのDockerイメージは登録時間で一番新しいものです。

前もってイメージIDをコピーしておきます。コンテナを実行するために以下のコマンドを打ちます。

$docker run -p 80:3000 {image-id}

// コピーしたイメージIDを{image-id}に入れます。

ここで、ポート:80:3000へアプリケーションを展開します。Dockerをローカル実行するのでhttp: // localhost にアクセスして確認します。

7. レジストリ作成およびそこへのDockerイメージのプッシュ

Amazon Elastic Container Registry (ECR) は、完全マネージド型のコンテナレジストリです。このレジストリを使うと、コンテナイメージをどこにでも簡単に保存、管理、共有、デプロイすることができます。 Amazon ECR はAmazon Elastic Container Service (ECS)と連携して開発から本稼働までのワークフローを簡素化することができます。

Dockerイメージをプッシュする前に、以下のコマンドを実行して、AWS CLIが自分のAWSアカウントで接続できていることを確認してください。

$ aws configure

AWS CLIが既にインストールされた場合、AWS設定として以下の情報が求められます。

$ aws configure
AWS Access Key ID [None]: <accesskey>
AWS Secret Access Key [None]: <secretkey>
Default region name [None]: us-east-2
Default output format [None]:

AWS CLIが正確に設定されていることを確保するため、AWS設定コマンドを再度実行して、表示される確認プロンプトでエンターキー押下してください。

レジストリ作成の手順は以下の通りとなります。

まず、AWSマネジメントコンソール へアクセスし、ログインを行います。

つぎ、Servicesカテゴリーから、Containersの中にあるElastic Container Service(ECS)を選択します。

つぎ、左メニューのECRからはRepositoriesへ辿ってから、Create Repositoryメニューを選択した後に、リポジトリ名(例:"ecs-nodejs-app")を入力してCreate Repositoryボタンを押します。


つぎ、右上にあるView Push Commandsをクリックした時に表示される4つの手順どおりに、Dockerイメージをビルド、タグ作成し、プッシュします。

その後、Amazon ECRへ戻って、先ほど入力したリポジトリ名をクリックするとDockerイメージが見えます。 次の手順に使うので、そのイメージのURIをコピーしておいてください。

次の手順で、 EC2インスタンスでDockerイメージを実行するために使われるTask Definitionというタスク定義)、Clusterというクラスター、Serviceというサービスを作成します。

8. タスク定義の作成

AWSでのタスクはDocker CLIでのDocker実行コマンドのように機能しており、以下のように定義されています。

  • Container images
  • Volumes
  • Networks Environment Variables
  • Port mappings

以下に、タスク定義の作成手順を示します。

1. ESCダッシュボードにあるTask Definitionsより、Create new Task Definitionを押下

2. Launch TypeでEC2を選択

3. タスク名(例:"ecs-nodejs-app-task")を入力してから他の項目を飛ばして、下部へ辿ってAdd containerを押下

4. コンテナ名(例:"ecs-nodejs-app-container")を入力

5. 前の手順でコピーしておいたイメージのURIをImageにペースト

6. Memory Limitsで"Soft Limit"を選択し、適当な値を(例:"512")を入力

7. Port Mappingで、各ポートを"80: 3000"で入力、プロトコルを"tcp"と選択

8. Environment Variablesへ辿って、Keyに"NODE_ENV"、Valueに"production"を入力

9. 他の項目を飛ばして一番下にあるAddを押下

10. Create Task Definition画面へ戻し、対象のコンテナとDockerイメージが表示され、下部へ辿ってCreateを押下

9. クラスターの作成

以下に、クラスターの作成手順を示します。

1. ServicesカテゴリーよりECSを押してECSダッシュボードへ戻す

2. 左メニューよりAmazon ECS(EKSではない)の直下にあるClustersをクリックしてCreate Clusterを押下

3. クラスター・テンプレートとしてEC2 Linux + Networkingを選択してNext Stepを押下

4. クラスター名(例:"ecs-nodejs-app-cluster")を入力

5. EC2 Instance Typeでデフォルトのままにするか"t2.micro"を選択

6. Number of instancesに"1"、EBS Storageに"30"を入力

7. Key pairでデフォルトのままにするか、対象のEC2インスタンスへSSHしたい場合の既存キーを選択

8. VPCでCreate a new VPCを押して新規作成して、下部へ辿る

9. Container instance IAM roleで作成した権限(例:"ECStoEC2role")を選択してCreateを押下

処理に数分がかかります。終わったらView Clusterを押下することで、Active状態が見えます。

10. クラスター実行用サービスの作成

この手順で、クラスターを実行するためのサービスを作成します。

以下に、サービスの作成手順を示します。

1. 左メニューのECSよりTask Definitionを押してから、定義したタスク(例:"ecs-nodejs-app-task")を選択

2. 最新版を選択

3. Create new revisionの横にあるActionカテゴリーよりCreate Serviceを選択

4. Configure Serviceページで、Launch typeでEC2を選択

5. Clusterで作成したクラスター(例:"ecs-nodejs-app-cluster")を選択

6. サービス名(例:"ecs-nodejs-app-service")を入力

7. Number of Tasksに "1"を入力

8. 他の項目や次のページを飛ばして、4ページへと移動してから下部へ辿ってCreate Serviceを押下

9. Launch Statusページで、作成したサービスに緑チェックマークが入る。View Serviceを押した後に、TasksタブのLast Statusが"PENDING"であるならば、少し時間が経過し、または、再描画アイコンをクリックすることで"RUNNING"になる

ClusterからEC2 instancesタブで対象のインスタンス・コンテナを押すことで公開DNSリンクを生成します。


ブラウザーでその公開DNSへアクセスすると、作成したアプリが開きます。

ec2-52-193-75-195.ap-northeast-1.compute.amazonaws.com

Githubからサンプルソースを参考にしましょう!

参考元

https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started.html

https://blog.clairvoyantsoft.com/deploy-and-run-docker-images-on-aws-ecs-85a17a073281

https://medium.com/boltops/gentle-introduction-to-how-aws-ecs-works-with-example-tutorial-cea3d27ce63d