Posted at

AWSとDockerを雰囲気で触ってきたのでまとめる(インスタンス作成->docker runまで)

More than 1 year has passed since last update.


AWS上でDockerを使ったサーバー構築をする


雰囲気的な持ち物


  1. AWSアカウント

  2. AWS client toolの用意(AWS CLI)

  3. Githubアカウント(既存のプロジェクトクローンする用)

  4. Docker実行環境


持ち物の用意


AWS CLI -> ローカルからインスタンスに接続するためのコマンドラインインターフェース。

pythonでpipを落とす brewでもいい

python get-pip.py

sudo pip install aws cli


あとで

aws configure

接続先のインスタンスの情報設定を行う

AWS Access Key ID [None]: ①後の手順のcredential.csvを参照する

AWS Secret Access Key [None]: ①後の手順のcredential.csvを参照する
Default region name [None]: ②立てたインスタンスのリージョン
Default output format [None]: ③json, text, table形式が選択できる こだわりがなければjson


Dockerのインストール

DockerCommunityに新規登録後dmgが落とせます

https://store.docker.com/editions/community/docker-ce-desktop-mac


構築作業

1, IAM権限の設定, credential.csvのダウンロード, aws configure(持ち物2.を参照)

2, Dockerfileをローカルのプロジェクトに落とす

3, リポジトリの作成

4, クラスターの作成

5, タスク定義

6, タスクの実行

7, EC2上のDockerコンテナに入る


1, AWS コンソールを開く

AWSサービス -> IAM -> ユーザー

ユーザー名:なんでもいい

アクセスの種類:プログラムによるアクセス

アクセス権限

ポリシーのフィルタ横から

AmazonEC2FullAccess

AmazonEC2ContainerRegistryFullAccess

AmazonECS_FullAccess

AmazonEC2ContainerServiceFullAccess

AmazonEC2ContainerServiceRole

AdministratorAccess

をそれぞれ検索してチェック, 確認

2回目以降であれば

既存のポリシーを直接アタッチ->設定に飛ぶ

ユーザーの作成に成功すると.csvが落ちてくる

拾い忘れるとCLIから入れないので注意


2, ローカルのコマンドライン

既存のプロジェクトをcloneもしくは自作する

プロジェクト内で

docker build -t project_nameで構成をビルドする

docker run -d 80:80 --name project_name project_name:latest

仮想サーバが起動する

* -d ホストのポート:コンテナのポート, 最後の引数はインスタンスのタグらしい


3, AWSコンソールに戻る

サービス -> ElasticContainerService

Amazon ECR -> リポジトリ

リポジトリの作成

リポジトリ名:必ずDockerfileのあるプロジェクトと同名。

後々sshする時に設定がめんどくさいらしい。

完了は押さずに下記をコマンドラインで実行。

aws ecr get-login --no-include-email --region us-east-2

cliからログイン

docker build -t test .

docker tag test:latest ************.dkr.ecr.us-east-2.amazonaws.com/test:latest

イメージとコンテナを紐つけ

docker push ************.dkr.ecr.us-east-2.amazonaws.com/test:latest

Dockerイメージをプッシュ

完了


4, そのままAWSコンソール

Amazon ECS -> クラスター

クラスターの作成

EC2Linux + ネットワーキングを選択

クラスター名:プロジェクトと同名

プロビジョニング:オンデマンドインスタンス(従量課金)

EC2インスタンスタイプ:t2.micro(最小)

インスタンス数:1

キーペア: EC2コンソールのリンクをクリック

識別しやすい名前で作成 pemはプロジェクトの適当な場所に置いておく

更新 -> 作成したキーペアを選択


5, そのままAWSのコンソール

AmazonECS -> タスク定義

新しいタスク定義の作成

起動タイプ互換性 EC2を選択

Fargate ?

EC2を立ち上げずにコンテナを立ち上げる仕組み <= new!!

fargate使うとsshが使えない CLIコンテナの中にアクセスする方法がない
コンテナだけ立ち上がるため
今回はEC2 Linux + ネットワーキングを選択する
クラウドウォッチでログが出力される プロジェクト単位のログ管理はプログラムから実装する必要がある

タスク定義名:プロジェクト名と同名で良い

タスクサイズ:タスクメモリ:128GB(お試しサイズ)

コンテナの追加:プロジェクト名と同名で良い

メモリ制限:128GB

ポートマッピング:ホスト80:コンテナ80:tcp

セキュリティに80はよく使うのでよろしくないかも

任意

CPUユニット数:1

で作成。


6, そのまま(略)

クラスター -> タスク タブ

起動タイプ:EC2

タスク定義:さっき作成した名前:1

タスクの実行

パブリックDNSをポチってプロジェクトの画面が見えればおけ。


7,

ElasticContainerInstance -> ネットワーク&セキュリティ

セキュリティグループ -> さっき立てたインスタンスに対してチェック -> アクション

インバウンドルールの編集

http, tcp, 80

リソースは カスタム, 0.0.0.0/0に設定,保存

コマンドラインに戻る

chmod 400 さっきの.pem

ssh -i "さっきの.pem" ec2-user@インスタンスDNS URIで接続

入れたらdocker psで動いているプロセスの確認ができる


おまけ


インスタンスの削除

インスタンスのみの削除はできない(起動・停止・削除はできる)

クラスターグループが動いている限りまた起動する可能性があるので

クラスターグループの削除で完全にインスタンスを削除できる


感想


  • ポリシーが1年365日に迫る勢いで用意されている、怖い。(用途が把握しきれなそう)

  • 個人的にはGCPよりも導線が難しいと感じる

  • IAMの設定は完全に雰囲気だった(しかし設定し忘れるとpushができない、危険)