知識0から Docker 環境を AWS の ECS でデプロイするまで

はじめに

この投稿はアイスタイル Advent Calendar 2018 の1日目の記事です。

皆さんこんにちは。1発目は新卒2年目のurabes から紹介させて頂きます。
本記事は「とりあえず!デプロイまでを Docker & AWS で行ってみたい」と思った「やってみた系」です。

皆さんの会社では DevOps の為の施策、取り組んでいますか?最近よく耳にしますよね。

弊社でも絶賛 DevOps を進めていまして、その中の取り組みとしてマイクロサービスの運用に Docker と AWS の推進を行っています。現在、Docker,AWS を用いてのプロダクト管理は行い始めてはいるのですが、サービスの運用において未だデプロイまでを行ったことがありません。

まだ私個人としても、DockerやAWSの経験が少なく、これを機にDockerとAWSを利用してデプロイをしてみたいという好奇心でやってみたことを記事にしました。

しかし結構学習ボリュームがありまくりでして、、、この記事も投稿日ギリギリまで執筆していました。愚かなり。

どちらも触ってみてまだまだ経験が浅い拙い内容ですが、復習がてらご紹介したいと思います。

そもそも Docker とは?


Docker はクライアント・サーバ型のアーキテクチャです。Docker クライアント と Docker デーモン が通信することによって、Docker コンテナの構築・実行・共有といった力仕事を行ってくれます。Docker クライアントとデーモンは、お互いにソケットか RESTful API を通して通信を行います。

参考文献:Docker-docs-ja アーキテクチャの理解

そもそも Amazon Elastic Container Service (ECS)とは?

公式
Ec2インスタンスを用いて、クラスタ構成をしてくれることで Docker コンテナをよしなにラッピングして実行、停止を簡単にしてくれる管理サービス。

実際にやってみよう

1.Docker をダウンロード・インストール

2. AWS CLI をインストール

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
$ sudo pip install awscli
$ aws --version

3. IAM ユーザ作成

IAM とは
1. AWS のコンソールから IAM サービスにアクセス
2. サイドバーにある[ユーザー]をクリック
3. ユーザーを入力。[プログラムによるアクセス]をチェック
4. [次のステップ:アクセス権限]をクリック

5. [既存のポリシーをアタッチ]をクリック
6. [フィルター: ポリシータイプ]の検索窓に’EC2’と入力
7. 以下のポリシーの項目をチェック
[AmazonEC2ContainerServiceFullAccess],
[AmazonEC2ContainerRegistryFullAccess]
※管理者権限による Amazon ECR へのフルアクセスを許可するもの

8. [次のステップ:タグ]を選択
※タグの追加は今回は行わないのでスキップ
9. [次のステップ:確認]を選択
10. [ユーザーの作成]をクリック
11. [.csvのダウンロード]からファイルをダウンロードする

4. 認証情報(アクセスキー)設定

先程ダウンロードしてきた.csv を開き、書かれている情報を元に各コマンドを入力していく。

$ aws configure                 #AWS 認証情報の設定
$ sAWS Access Key ID [None]:    #取得したアクセスキーID を入力
$ AWS Secret Access Key [None]: #取得したシークレットアクセスキーIDを入力
$ Default region name [None]:   ap-northeast-1
$ Default output format [None]: json
$ aws configure list            #設定した内容の確認

5. Docker をローカルで起動

$ git clone https://github.com/TRBRS/ecs_test.git
$ cd ecs_test
$ docker build -t php .
$ docker run -d -p 80:80 --name php php:latest

「localhost:80」をブラウザで開き、”Hello World” が表示されているか確認。

6.キーペアの作成

サービスから EC2 > キーペア で「キーペアの作成」をクリック。名前はよしなに。

7. ECSリポジトリに Push

  1. サービスから[ECS]を選択
  2. サイドバー[リポジトリ]から[リポジトリの作成]をクリック
    ①: レポジトリ名に[php]を入力し[次のステップ]をクリック
    ②: コマンドが出てくるので、上から順番に実行し、全て完了したのち[完了]をクリック
  3. サイドバー[タスク定義]から[新しいタスク定義の作成]をクリック
  4. タスク定義名に「php」と入力
  5. [コンテナの追加]をクリックし、下記を入力し[追加]をクリック
  6. [作成]をクリック
    項目
    コンテナ名 php
    イメージ リポジトリのURI/イメージのタグ
    メモリ 任意
    ポートマッピング ホストポート80, コンテナポート80
    CPUユニット 1
  7. [作成]をクリック

  8. サイドバーの[クラスター]から[クラスターの作成]をクリック

  9. 「クラスター名」に[php]と入力
  10. 「EC2インスタンスタイプ」に[t2.micro]を指定
  11. 「インスタンス数」は[1]を指定
  12. 「キーペア」 事前に用意した伴を指定
  13. [作成]をクリック
  14. 作成したクラスター(今回の場合[php >])をクリック
  15. [タスク]の項目から[新しいタスクの実行]をクリック
  16. タスク定義に[php:1]を指定 #タスク定義されているモノが選択出来るので先に作成している事
  17. タスクの数に[1]を指定
  18. [タスクの実行]をクリック
  19. 状態が[RUNNING]であることを確認する

  20. パブリックDNSまたはパブリックIPをブラウザで開き“Hello World”と表示されれば成功!

おわりに

無事EC2クラスターインスタンス上のDockerコンテナでphpを実行することできました。今回はただの“Hello World”でしたが簡単に表示させることができ、便利さを実感できましたね。
また、環境をすぐ壊し、新しくつくり直すことができるのもかなり気兼ねなく触られて(僕みたいなやらかしてしまうタイプにはピッタリ)メリットの1つだと思います。
現状はローカルのデプロイまでしかできませんでしたが、今度は本番でのデプロイにチャレンジしてみて記事を書こうと思います。

ただ新しいサービスをつくるのではなく、愛する自分たちのサービスを腐らせない為にも DevOps の実現は不可欠であり、レガシーシステムに立ち迎えられるようなバックエンド開発ができるようにどんどんインフラの技術をアップデートしていきましょう!

続いて2日目は anntoqueさんで python seabornを利用して「競合」の定義を考える です!

バックエンドエンジニア。絶賛Laravel の修行中。 最近は Docker,AWSなど今後の運用を見越した構築に興味あり。 最初の乾杯から〆の一杯までいけるくらい日本酒を愛す。