AWS上でDockerを使ったサーバー構築をする
雰囲気的な持ち物
- AWSアカウント
- AWS client toolの用意(AWS CLI)
- Githubアカウント(既存のプロジェクトクローンする用)
- 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ができない、危険)