【その参】Apache/PandocでMarkdownをHTMLにして配信するDockerコンテナの作成 - AWSコンテナ


先日ApacheとPandocを組み込んだDockerコンテナを紹介しました。
Markdownソースの取得元がコンテナホストのローカルフォルダの場合と、リモートから取得するふたつの版を紹介しました。

- [ローカル版](https://qiita.com/abun-kobu/items/f390846cdb474777ca84)
- [リモート版](https://qiita.com/abun-kobu/items/fbed1e39a8de88d49f46)

この記事では、リモート版をパブリッククラウドが提供するDockerコンテナサービスのひとつ、Amazon ECS（Elastic Container Service）で動作させたので、その手順を説明します。

## AWS ECS

アマゾンのDockerコンテナサービスには種類があります。

- Elastic Container Service (ECS)
- ECS for Kubernetes (EKS)
- Fargate

このうち今回使用したECSはAWSの仮想マシン（EC2インスタンス）を使ってコンテナのクラスタを構成し、このなかでタスクと呼ばれるDockerコンテナを集めたサービスを実行します。

以下は、一個のEC2インスタンスで構成したクラスタで一個のタスクを含むサービスを動作させてみた様子です。
使用したDockerイメージはDocker Hubに登録済みのリモート版です。

- [kobucom/pandoc:remote1](https://hub.docker.com/r/kobucom/pandoc/tags)

AWSのサービスを利用する場合、Webのコンソールから行う方法と、AWS CLIをインストールしたターミナルからコマンドラインで行う方法があります。
以下はコンソールを用いました。

もし同じことをなさる場合は下記を行ってください。

- AWSアカウントの作成（大半のサービスは1年無料）→ [Sign up](https://portal.aws.amazon.com/billing/signup#/start)
- IAMユーザの作成（アカウントのルートユーザとは別のコンソールユーザを作成するのがよいとのことなので）

## コンテナサービスに入る

AWSのコンソールにログインして

→ https://*account-id*.signin.aws.amazon.com/console/

ECSサービスを選び、順に次のものを作っていきます。

- タスク
  - Dockerコンテナの割り当て
- クラスタ
  - EC2インスタンスの作成
- サービス
  - タスクを指定

筆者は以下で示す以外の選択項目はすべてデフォルトにしました。
指定や変更が必要だった箇所を中心に説明します。

## タスクの作成

![1-task-create](https://kobu.com/docker/q-images/1-task-create.png)

- コンテナの収容先として「EC2」を選ぶ（ほかにFargateがある）
- タスクに名前を付ける
- コンテナに名前を付ける
- イメージを指定
  イメージの取得元のデフォルトはDocker Hubなので単に「kobucom/pandoc:remote1」を指定
- クラスタからコンテナへのポートマッピング
  TCP:80 → 80

![2-task-create](https://kobu.com/docker/q-images/2-task-create.png)

## クラスタの作成

![3-cluster-create](https://kobu.com/docker/q-images/3-cluster-create.png)

- クラスタの種類として「EC2 Linux + Networking」を選ぶ
- クラスタに名前を付ける
- EC2インスタンスのタイプと個数を選ぶ
　無料なのはt2.microまたはt3.microが1個
- EC2のインスタンスのイメージ（AMI）はデフォルトのものがECS対応なので変更しない
- この仮想マシンにあとからログインしたければSSH用のキーペアを指定しておく
- VPC（クラウド内の内部ネットワーク）、サブネット、セキュリティグループはリストにあるもの（デフォルト）を選んでおく

>このうちセキュリティグループ（ファイアウォールの設定）はあとで変更する

## サービスの作成

![4-service-create](https://kobu.com/docker/q-images/4-service-create.png)

- サービスの収容先として「EC2」を選ぶ（ほかにFargateがある）
- 作成済みのタスクを選ぶ
- サービスに名前を付ける

## IPアドレスの特定

作成したコンテナサービスに接続するにはIPアドレスを知る必要がある。
AWSのEC2はそのIPアドレスに対してDNSのホスト名を割り当ててくれるのでそちらを使ってもよい。

わかりづらいが、クラスタを選び、EC2インスタンスを選び詳細タブを見るとコンテナインスタンスの属性が確認できる。

![5-public-ip](https://kobu.com/docker/q-images/5-public-ip.png)

トップページの表示:

```
$ curl ec2-nnnnnnnn.ap-northeast-1.compute.amazonaws.com/
```

リモートのMarkdownファイルの表示:

```
$ curl ec2-nnnnnnnn.ap-northeast-1.compute.amazonaws.com/foo.md
```

## セキュリティグループの変更

ここまでの設定でテストしてみたところ接続がタイムアウトした。
調べてみると「セキュリティグループ」を変更して仮想マシンのポートを開く必要があった。

これもわかりづらいが、クラスタを選び、EC2インスタンスを選び、深く深く入っていくと、EC2サービスに飛ぶので、そこでセキュリティグループが変更できるようになっている。

![5-edit-security-group](https://kobu.com/docker/q-images/6-edit-security-group.png)

変更後、トップページ、リモートのMarkdownファイル、ともに表示に成功した。

---

### 使用環境

- Docker CE 19.03.12
- ベースイメージ: 公式 [httpd:2.4](https://hub.docker.com/_/httpd)
- テスト環境: Amazon AWS - Elastic Container Service (ECS)

### 参考リンク

- [Apache](https://httpd.apache.org/)
- [Pandoc](https://pandoc.org/)
- [Docker](https://www.docker.com/)
- [AWS ECS](https://aws.amazon.com/ecs/)

### サンプルリソース

- [github](https://github.com/kobucom/docker-pandoc-pandoc) 
- [docker-hub](https://hub.docker.com/r/kobucom/pandoc) 

### 横浜工文社の関連ページ

- [Markdown変換Docker](https://kobu.com/docker/index.html) 
- [Markdownダイナミック変換](https://kobu.com/markdown/dynamic.html)
- [Markdown解説](https://kobu.com/markdown/index.html)

Written 2020/09/22