ECSとDockerの使い方-第1部:ECS&Dockerハンマー


Dockerizing


まず、Dockerを使用してサーバイメージを構築します.
構築する画像には、2つのサーバのコンテナ画像と、2つのリポジトリのフロントエンドで使用されるnginxコンテナ画像が含まれます.
nginxを使用する主な目的は「開発とテスト」です.実際には、セキュリティとパフォーマンスの問題のため、本番環境の一部の高度な公式ドキュメントではrunserverの使用は推奨されません.

(出典:https://docs.djangoproject.com/en/2.2/ref/django-admin/#runserver)
したがって、runserverの代わりにWebサーバゲートウェイインタフェース(WSDi)のuWSDiを使用して障害を実行します.
ここで「なぜwsgiを使うのですか?」疑問が生じるかもしれません.
  • wsgiサーバは、大量のリクエストを処理するために設計されています.
  • フレームワークは、大量の要求を最適な方法で自分で処理するのではなく、フレームワークを実行するサーバによって決定される.
  • wsgiを使用すると、本明細書のWebフレームワーク機能を使用しながら、nginxをフロントエンドに貼り付けることで、リバースエージェントなどのパフォーマンスを向上させることができます.
    各画像を作成するには、次の手順に従います.

    1. django application


    Dockerfile
    FROM python:3.6
    
    ENV PYTHONUNBUFFERED 1
    
    ENV PATH="/scripts:${PATH}"
    
    ENV ENV=dev # 환경에 따라 각각 다른 태그를 부여합니다.
    
    WORKDIR /app
    
    COPY . .
    
    COPY ./scripts /scripts
    
    RUN pip install -r requirements.txt --no-cache-dir 
    
    RUN chmod +x /scripts/*
    
    RUN mkdir -p /vol/web/media
    RUN mkdir -p /vol/web/static
    RUN adduser user --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password
    RUN chown -R user:user /vol
    RUN chmod -R 755 /vol/web
    USER user
    
    CMD ["entrypoint.sh"]
    なぜ日立runserver--gecosコードをユーザーに選択させたのですか?
    ¥¥¥¥¥¥¥¥¥--disabled-passwordオプションでユーザーのその他の情報を設定します.--disabled-passwordオプションはありませんが、githubアクションを使用して管理するので、gecosに値を割り当てて、ユーザーに関連する不要なエラー出力を設定しないようにします.
    entrypoint.sh-migrateやuwsgiなどのコマンドを1つのファイルで管理する
    #!/bin/sh
    
    set -e
    
    python manage.py collectstatic --noinput
    
    python manage.py migrate --noinput
    
    uwsgi --socket :8000 --master --enable-threads --module (파일명).wsgi
    次のDockerfileパスでbuildコマンドを入力します.
    docker build . (-t 태그) (-f 도커파일명)

    2. nginx


    Dockerfile
    FROM nginxinc/nginx-unprivileged:1-alpine
    
    COPY ./default.conf /etc/nginx/conf.d/default.conf
    COPY ./uwsgi_params /etc/nginx/uwsgi_params
    
    USER root
    
    RUN mkdir -p /vol/static
    RUN chmod 755 /vol/static
    
    USER nginx
    default.conf
    server {
        listen 8080;
    
        location /static {
            alias /vol/static;
        }
    
        location / {
            uwsgi_pass 127.0.0.1:8000;
            include /etc/nginx/uwsgi_params;
        }
    }
    次のDockerfileパスでbuildコマンドを入力します.
    docker build . (-t 태그) (-f 도커파일명)
    これにより、ユーザは8080ポートを介してnginxコンテナに接続し、nginxコンテナは8000ポートを介してdjangoコンテナに接続することができる.

    ECS cluster - Fargate vs EC2


    生成された画像をECRにプッシュする前に、ターゲットとなるクラスタを作成する必要があります.
    AWSでは、EC 2、Fargateでクラスタインフラストラクチャを選択できます.
    EC 2は、CPU利用率が予測可能で安定したシステムにおいてより高い効率を提供し、fargateは負荷の変化が大きい環境においてより高い効率を提供する.
    infockリンクは常にスケーリングされ、通常はワークロードが比較的低いため、最終的にfargateが選択され、低CPU単位(0.25)を使用することができる.
    ここで、作成した画像をECRにプッシュします!

    イメージをリポジトリにアップロード(feat.m 1)


    (環境でm 1チップを使用しない場合は、この手順をスキップできます.おめでとうございます!)
    これは私たちがこのプロジェクトで出会った最も困難であり、最も時間のかかる画像アップロードでもあります.🥲
    通常、--gecos符号化を使用して画像を構築することができる.
    ただし、m 1チップの場合、構築されたイメージを使用してクラスタ上でタスクを実行すると、次のエラーが発生します.

    これは,ECSタスクとm 1チップによって構築されたイメージのアーキテクチャが異なるためである.
    ECSタスクのアーキテクチャは--gecosに設定され、m 1チップによって構築されたイメージのアーキテクチャはdocker build ~に設定される.Linux/X86_64コードを使用して、この問題を解決できます.arm64はdockerコマンドの拡張プラグインであり、マルチアーキテクチャイメージの構築に使用できます.必要な機能を含むカスタムコンストラクタを使用して、必要なフォーマットの画像を作成することもできます.
    Docker Buildx docker buildxオプションを使用すると、必要なアーキテクチャを指定できます.
    docker buildx build --platform linux/amd64 (-t 태그) . (--no-cache) (-f Dockerfile 이름)
    参考リンク(多くの達人たちに感謝します)
    stackoverflow - standard_init_linux.go:178: exec user process caused "exec format error"
    Docker Buildxを使用したマルチアーキテクチャ画像の構築
    M 1 MacBookユーザーに対してEKSを導入する際に発生したエラーに対して、
    [Devops] Docker buildx build(at M1 Macbook)
    これらの手順により、サーバイメージとnginxイメージを作成し、ECRを正常にリフレッシュできます.
    二部では、生成された画像からタスクとサービスを作成し、最終的にCodeDeployを行います!
    さらに詳細な内容とエラーについては、ここです。も参照できます.