見出し画像

[AWS] ECSでNginx

AWSのコンテナサービスECSを試してみた
ローカル環境はWindows11を使っている


事前準備

ECSはバックエンドの仕事をするうえで重要な知識だと思う
しかしいろいろわかりにくかったので少し整理してみた

ローカル環境でコンテナイメージを作成するのにDocker Desktopを使う

AWSにコンテナを登録するのに AWS CLIを利用する

DockerDesktopでコンテナイメージを作成

まずはDockecr DesktopとWindows  Power Shellを起動しておく

ローカル環境にフォルダを作り(この場合は適当にnginx)その下にDockerfileとindex.htmlファイルを作成する

nginx
┗ Dockerfile
┗index.html

ファイルの内容は以下の通り

Dockerfile

FROM nginx:latest
COPY index.html /usr/share/nginx/html
EXPOSE 80

index.html

<!DOCTYPE HTML>
<html lang=”ja”>
<head>
  <meta charset="UTF-8">
  <title>Hello, World</title>
</head>
<body>
  <h1>Hello, World</h1>
</body>
</html>

PowerShell上で作成したフォルダに移動

cd X:\xxxx\xxx\nginx

Dockerイメージをnginx-testという名前で作成する
コマンドの一番最後の . はカレントディレクトリを意味する . なので
かならすnginx-test のあと空白をいれて . と入力する

docker build -t nginx-test .

成功するとDockerDesktopのImagesに追加されるのが確認できる

念のため動作確認
ローカル環境にコンテナをデプロイ

docker run -p 80:80 -d nginx-test

ブラウザ上で

http://localhost/

にアクセスして

と出ればOK
起動し続ける必要はないのでDockerDesktopのContainers上でコンテナを破棄しておく

Amazon ECRにコンテナイメージを登録

ECRはElastic Container Registryの略で、コンテナイメージを登録しておくDockerHubのような場所

ECR上にリポジトリを作成する

GUI上で作成してもいいが今回はコマンドラインで作ってみる

aws ecr create-repository --repository-name nginx-test

成功すると作られたリポジトリの情報が表示される

{
    "repository": {
        "repositoryArn": "arn:aws:ecr:ap-northeast-1:????????????:repository/nginx-test",
        "registryId": "????????????",
        "repositoryName": "nginx-test",
        "repositoryUri": "????????????.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test",
        "createdAt": "2023-02-14T11:35:48+07:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": false
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}

すでに作成済みのリポジトリ情報を得ることもできる

 aws ecr describe-repositories --repository-names nginx-test


dockerコマンドでECRにアクセスできるようにする

aws ecrのログインパスワードを取得してdockerにログインする
リージョンは東京(ap-northeast-1)の前提

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 255885943062.dkr.ecr.ap-northeast-1.amazonaws.com

成功するとLogin Succeededと表示される

コンテナイメージをリネームする

ECRにコンテナイメージを登録するためには決められた名前が必要らしい
docker tagコマンドを使う

docker tag [既存のイメージID] [新しいイメージ名]

新しいイメージ名はaws ecr create-repositoryを使ったときに表示された
repositoryUriにタグを追加したものになる

docker tag {イメージID} {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:{タグ}

{アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com
ここのアカウントIDはリポジトリの作成時に表示された
"repositoryUri": "????????????.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test",
この????????????に相当する12桁の数値になる

別の確認の仕方としては

aws sts get-caller-identity

を実行すると表示されるAccountの数字がそう

また、{イメージID}のほうは

docker images

このコマンドを使えば確認することができる12桁の数値だ

{タグ}はイメージを識別するための文字列で
バージョン情報などを追加しておく
今回はlatestとつけることにする

まとめると以下のようなコマンドになる

docker tag 999999999999 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:latest

成功するとDockerDesktopのImagesタブで、新しい名前のコンテナイメージが追加されているのを確認することができる

ECRにプッシュする

docker push {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:{タグ}

{アカウントID}と{タグ}は上と同じ

実行するとデータのアップロードが始まり数分程度で終了する

GUIで確認してみる

AWSコンソールからElastic Container Serviceに飛ぶ

左のタブからリンクで移動できる

左のタブからRepositoriesを選択

追加されていることが確認できる

Amazon ECSにデプロイ

ECRに登録したコンテナイメージをECSにデプロイする
ここからはGUIを使ってすすめる

ECSのトップ画面から

クラスターを作成する

ECSトップ画面で左のタブからクラスターを選択したあとで
クラスターの作成を押す

クラスター名を適当に設定
今回は nginx-test-cluster とつけた

VPCとサブネットを選択

VPCは、AWSのアカウントを作ればデフォルトのVPCが作られているのでそれを選択してもよいし、新たに作り直してもよい

以下の記事はVPCの説明と作成手順を書いている

VPCとサブネットを選択する
サブネットはパブリックサブネットを最低2つ選択する

インフラを選択する
Fargateを利用するのでデフォルトのまま

モニタリングとタグも特に設定せず
[作成]を選択


メッセージが表示されて作成される

タスク定義を作成する

タスク定義ではコンテナイメージのURLや起動させるインスタンスに割り当てるメモリやCPUなどを指定する

左のタブからタスク定義を選択し[新しいタスク定義の作成]を押す

二つの選択肢が選べるので、今回はJSONを使わない方法ですすめる

Step1
タスク定義ファミリー名:nginx-test-task-family
コンテナ名:nginx
イメージURI:????????????.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test
コンテナポート:80
プロトコル:TCP
ポート名:nginx-80-tcp(自動作成)
アプリケーションプロトコル:HTTP

次へを選択

Step2

アプリケーション環境:AWS Fargate(サーバーレス)
オペレーティングシステム:Linux/X86_64
CPU:.25vCPU(テストなので最小)
メモリ:.5GB(テストなので最小)
タスクロール:なし
タスク実行ロール:新しいロールの作成

エフェメラルストレージ/量:空白(デフォルトで20GBになる)

その他、ストレージ、モニタ、タグの項目は特に触らず
[次へ]

Step3
内容を確認してから
[作成]

メッセージがでてタスク定義が作成される

セキュリティーグループを作成する

タスク定義が作成できたら次はそれを実行するのだが、
その際にセキュリティグループを選択する必要があるので事前に作っておく

AWSコンソールでVPCに移動

[セキュリティーグループ]を選択

[セキュリティグループを作成]を選択

セキュリティグループ名:nginx-test-sg(なんでもよい)
説明:nginxコンテナに対するhttpアクセスを許可(なんでもよい)
vpc:今回はデフォルトのVPCを選択

インバウンドルール
タイプ:HTTP
ソース:Anyware

インバウンドルールは外部からこちらに入ってくるアクセスをどう許可するかを指定するもので、この設定はポート80番にアクセスしてくるあらゆるTCP通信を許可するという意味になる

アウトバウンドルールは逆にこちらから外に対するアクセスの許可でデフォルトのままだがすべてのアクセスを許す設定になっている


タスクを実行する

ECSダッシュボードからクラスターを選択

タスクタブにある[新しいタスクの実行]を選択

環境
キャパシティープロバイダー戦略、起動タイプどちらを選択してもよい

デプロイ設定

アプリケーションタイプはタスクを選択
タスクファミリーは作ったnginx-test-task-familyを選択
あとはデフォルトのままで

ネットワーキング
VPC,サブネットはデフォルトのまま
セキュリティグループは既存のセキュリティグループにし
事前に作っておいたnginx-test-sgを選択する
パブリックIPはオンにする

最初ここで新しいセキュリティグループの作成を選んで同じ設定にして試したのだが、うまくいかなかった。
ちょっと原因不明なので事前に作っておいて選択するようにした

その他の設定はすべてデフォルトのままにして
[作成]を選択

クラスター上にタスクがリストされる

実行中のタスクを選択するとタスクの詳細が確認できる

動作確認する

実行中のタスク情報からパブリックIPを調べて
http://パブリックIP
にブラウザでアクセス
今回の場合は http://43.207.127.188

とローカル環境で試した時と同じ結果がでれば成功


引き続きHTTPS接続したい場合は以下を


いいなと思ったら応援しよう!