0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ECS にサービスをあげるまでに詰まったこと・解決法

Posted at

はじめに

とりあえず ECS に web アプリをデプロイするための一連と道中で詰まったことをメモする記事です。

今回デプロイした簡単な web アプリ

実行環境

Apple M3 チップ
macOS 15.6.1

やったこと概要

  1. アプリの実装
  2. Docker イメージの作成・動作確認
  3. ECR への push
  4. ECS でサービスのデプロイ(Express 使用)
    1. ポート設定

【番外編】

  1. EC2 で Docker build & ECR への push
    1. ローカル → EC2 へのファイル転送
    2. EC2 への Docker 導入
    3. ECR への push

やったこと

1. アプリの実装

ただページを返すだけの FastAPI Web アプリを作成。
起動コマンドなどは README.md 参照。

2. Docker イメージの作成動作・確認

# Docker イメージ作成
docker build . -t simple-web-app-image

# Docker コンテナ起動
docker run -p 8000:8000 simple-web-app-image:latest

以下にアクセスして画面が表示されたらOK

3. ECR への push

ECR リポジトリの作成

image.png

リポジトリ名のみ任意に入力。その他の設定はそのままで「作成」

ローカルで AWS 設定

AWS CLI 設定

以下から macOS → Command line installer - All users で aws コマンドを実行できるようにすると良い

認証情報の取得・設定

AWS コンソール

IAMユーザ任意のユーザ(ユーザがない場合は作成)セキュリティ認証情報アクセスキーアクセスキーを作成
image.png

次画面で コマンドラインインターフェイス (CLI) を選択し 次へアクセスキーを作成

image.png

AWS CLI
ターミナルから以下のコマンドを実行し、AWSコンソールで取得したアクセスキーとシークレットアクセスキー、リージョンを設定する

aws configure
AWS Access Key ID [****************]: ************* 
AWS Secret Access Key [****************]: ************
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [None]: 

ECR への push

ECR → 作成したリポジトリ → プッシュコマンドを表示
image.png

表示されるコマンドをターミナルで順次実行
image.png

リポジトリにイメージが追加されていることが確認できたらOK

4. ECS でサービスのデプロイ

ECS → Expressモード で先ほどデプロイしたイメージを選択し「作成」(かなり時間がかかる)
image.png

アプリの起動に失敗する
image.png

ログを確認すると起動自体には成功しているがその後終了している
image.png

解決方法
ECSデプロイしたサービス → 「サービスを更新」
その他の設定からコンテナポートを 8000(デフォルトは 80) 、 ヘルスチェックパスを / に設定し「更新」すると解決された。
image.png

原因
ECS がサービスを起動する際にヘルスチェックを行なっておりデフォルトではポート80番の / エンドポイントに対してリクエストを行い、ステータス 200 が返ってくるのを確認して正常にサービスの起動となる。
今回作成したイメージでは 8000 番でリッスンしていたためリクエストが届かず起動に失敗してしまっていた。

【番外編】 EC2 で Docker build & ECR への push

mac 環境でのイメージ作成に問題がある場合は EC2 にソースをアップロードした上で EC2 上にビルド・pushするとよいかも

1. ローカル → EC2 へのファイル転送

EC2 でインスタンスを起動する

AWSコンソールで EC2 へアクセスし、インスタンスを起動する(特に要件がない時は Amazon Linux の指定でよい)。

鍵の取得
作成する際に選択する「キーペア」は作成したインスタンスへアクセスするための鍵をさす。ここでは新しいキーペアの作成を行う。
新しいキーペアを作成するとインスタンスを作成した際に作成された秘密鍵がダウンロードされる。
※ 特に要件がない場合、「キーペアのタイプ」はどちらでもよく、「プライベートキーファイル形式」は .pem で良い
image.png

インスタンス画面から接続
image.png

「SSH クライアント」から秘密鍵の権限変更と SSH 接続を行うコマンドをコピーして実行し、SSH 接続ができるか確認する
image.png

SCP コマンドでアプリを EC2 に転送する

scp -i path/to/作成したペアキー -r path/to/アプリケーションディレクトリ ec2-user@IPアドレス:~/アプリケーションディレクトリ

2. EC2 への Docker 導入

sudo yum install -y docker          # dockerのインストール
sudo service docker start           # dockerの起動
sudo usermod -a -G docker ec2-user  # ec2-userをdockerグループに入れる。これでec2-userがdockerコマンドを実行できる
sudo docker info                    # dockerの起動確認

必要に応じて docker compose もインストール

DOCKER_VERSION=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | \
        grep tag_name | \
        sed -e 's/[^0-9\.]//g')
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v$DOCKER_VERSION/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose # docker compose に実行権限を付与
docker compose version # 起動確認

参考:

3. ECR へイメージを push

ECR へ push するための IAM ロールを作成

IAMポリシー
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CompleteLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:InitiateLayerUpload",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:BatchGetImage"
            ],
            "Resource": "arn:aws:ecr:us-east-1:111122223333:repository/repository-name" //pushしたいECRリポジトリのARN
        },
        {
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        }
    ]
}

参考:

EC2 インスタンスへ作成した IAM ロールをアタッチ

AWS コンソールから インスタンスを選択した状態で アクション → セキュリティ → IAMロールを変更 で先ほど作成した IAM ポリシーをアタッチした IAM ロールを選択する
image.png

EC2 に接続し ECR push コマンドを実行する

image.png

ECR → 作成したリポジトリ → プッシュコマンドを表示
image.png

表示されるコマンドをターミナルで順次実行
image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?