見出し画像

とあるecsの作業ログ

まあ、php5なわけだが、っていう

俺的なまとめ

  • terraformで一通りインフラ作る

    • ECSに配置する前にEC2にて一通り様子を見ておく。いずれにせよEC2一大はメンテ用であってもいい(常時起動しない)、これはDBのメンテナンスで使ってもいい。つまりec2をtfに含めておく必要がある。

      • (ただし後述のようにコンテナに入って直接bashでアクセスできるようにしておくと多少メンテはできるかもしれない)

    • ライブラリー込み込みでとりあえず最低限動かす

      • このときにチェックスクリプトで前段十分に検証する

    • ECSコンテナの中にアクセスできるようにやっぱり何とかする

    • RDSにデーターいれて接続テストする

composerの問題

pearを使っていてcomposerが一部機能しないのでvendorを丸コピーしている。これは後で修正していく。

  <?php
  date_default_timezone_set('Asia/Tokyo');
  require_once 'vendor/autoload.php';
  die("ok");

とりあえずチェックするスクリプトだけ書いた。これをECSに持っていく

Dockerfileのベースを作った

まあいろいろ苦しい

FROM php:5.6-apache

# Apacheのmod_rewriteを有効化
RUN a2enmod rewrite

# 古いDebianリポジトリの使用
RUN sed -i 's/deb.debian.org/archive.debian.org/g' /etc/apt/sources.list
RUN sed -i '/stretch-updates/d' /etc/apt/sources.list
RUN sed -i '/security.debian.org/d' /etc/apt/sources.list
RUN apt update

# MySQLとGD拡張機能のインストール
RUN docker-php-ext-install mysql
RUN apt install -y zlib1g-dev libpng-dev libjpeg-dev libfreetype6-dev
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ && docker-php-ext-install gd

# Zip拡張機能のインストール
RUN docker-php-ext-install zip

# IPAフォントのインストール
RUN apt install -y fonts-ipafont

# タイムゾーンの設定
RUN echo 'date.timezone = "Asia/Tokyo"' >> /usr/local/etc/php/conf.d/docker-php-timezone.ini;

# コンテナがリッスンするポートを指定
EXPOSE 80

これに先程のvendorとindex.phpをコピーしている。

COPY vendor /var/www/html/vendor
COPY index.php /var/www/html/
EXPOSE 80
% docker build -t php5-app .
% docker tag php5-app:latest ****.dkr.ecr.ap-northeast-1.amazonaws.com/php5-app:latest
% aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ****.dkr.ecr.ap-northeast-1.amazonaws.com
% docker push ****.dkr.ecr.ap-northeast-1.amazonaws.com/php5-app:latest

しかしこれを毎度やるのは厳しいのでスクリプトを書いた(書いてもらったとも言う)

# Dockerイメージ名とタグ
IMAGE_NAME="php5-app"
TAG="latest"

# ECRリポジトリの設定
AWS_ACCOUNT_ID="****"
REGION="ap-northeast-1"
REPOSITORY_NAME="php5-app"

# Dockerイメージをビルド
echo "Building Docker image..."
docker build -t $IMAGE_NAME .

# ECRへのログイン
echo "Logging in to Amazon ECR..."
aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com

# Dockerイメージにタグを付ける
echo "Tagging Docker image..."
docker tag $IMAGE_NAME:$TAG $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPOSITORY_NAME:$TAG

# ECRにDockerイメージをプッシュ
echo "Pushing Docker image to ECR..."
docker push $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$REPOSITORY_NAME:$TAG

echo "Docker image pushed to ECR."

# TODO: このスクリプトは現在手動でDockerイメージのビルドとプッシュを行っています。
# 今後の改善として、CI/CDパイプライン(例: Jenkins, GitLab CI, AWS CodePipeline)を設定して
# このプロセスを自動化することを検討してください。

タスク定義とecs cluster, ecs service, ecs task

をterraformでやる。まあ割愛。そのうちどこかに書くかも。

コンテナの中に入ってdebug

大抵これをやるハメになるってことを思い知る

このようにタスクロールが割り当てられてないとどうにもならん。

これ作る

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        }
    ]
}

これを割り当てたロール作る

ロール | IAM | Global (amazon.com)

この辺から




これをtfに当てる

  task_role_arn = "arn:aws:iam::*********:role/ecsTaskRole"
タスクロールにちゃんと割り当てできた

何はともあれ良さそうだ

ecsサービスの設定変更

これはサービスの設定で

enable-execute-command

を付けるっぽいんだがこれはwebコンソールからはセットできないくさい。

がまあterraformからはいけるみたいだ。とりあえず既存のサービスは強制終了しとく

強制削除
enable_execute_command = true

こんなのを付けて再度サービスを起動する

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service

describe-service

つか今のawsコマンドはECRのpushだけ行ってるので、これは権限的にとおらない

aws ecs describe-services \
    --cluster example-cluster \
    --services example-service

AnAn error occurred (AccessDeniedException) when calling the DescribeServices operation:An error occurred (AccessDeniedException) when calling the DescribeServices operation:

から権限を増やす

そしたら

aws ecs describe-services \
    --cluster example-cluster \
    --services example-service

みてえなコマンドを打つと

{
    "services": [
        {
            "serviceArn": "arn:aws:ecs:a

とかいうjsonがモモモッて出てくるので

enableExecuteCommandがtrueになっておる

ここで確認が可能だ。これがtrueになってないと一生繋がらん。

describe-task

このexecuteCommadがtrueになってるサービスから派生したタスクのみtaskにもenableCommandが付く。これも確認しておく必要がある

$ aws ecs describe-tasks \
    --cluster example-cluster \
    --tasks 0f622c70dc4b4458ad8d3b2b0e1b9baf # 実際のタスクID

タスクのidはそれぞれ違うから検索してこないといけなんだけどここでも

An error occurred (AccessDeniedException) when calling the DescribeTasks operation:

ってなるね。まあ権限はちょいちょい足していこう


まあよさそうだと。

aws ecs execute-command

ここまでで大体推測が付くんだけど

ecs:ExecuteCommand

権限がないので An error occurred (AccessDeniedException) when calling the ExecuteCommand operation とかになる

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecs:ExecuteCommand"
            ],
            "Resource": "*"
        }
    ]
}

リソースはもう少し絞ってもいいかも。ともあれ

% aws ecs execute-command \
    --cluster <your>-cluster \
    --task 0f622c70dc4b4458ad8d3b2b0e1b9baf \
    --interactive \
    --command "ps aux"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.


Starting session with SessionId: ecs-execute-command-05d8f0a04e0fae399
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  1.1  70212 22220 ?        Ss   20:35   0:00 apache2 -DFOREG
root        16  0.0  0.8 1330096 15700 ?       Ssl  20:35   0:00 /managed-agents
www-data    27  0.0  0.3  70292  7360 ?        S    20:35   0:00 apache2 -DFOREG
www-data    28  0.0  0.3  70292  7360 ?        S    20:35   0:00 apache2 -DFOREG
www-data    29  0.0  0.3  70292  7360 ?        S    20:35   0:00 apache2 -DFOREG
www-data    30  0.0  0.3  70292  7360 ?        S    20:35   0:00 apache2 -DFOREG
www-data    31  0.0  0.3  70268  7360 ?        S    20:35   0:00 apache2 -DFOREG
root        35  0.0  1.3 1415616 25172 ?       Sl   20:35   0:00 /managed-agents
www-data    50  0.0  0.3  70268  7360 ?        S    20:41   0:00 apache2 -DFOREG
www-data    73  0.0  0.3  70244  7360 ?        S    21:03   0:00 apache2 -DFOREG
root       202  5.0  1.2 1258124 22840 ?       Sl   21:26   0:00 /managed-agents
root       210  0.0  0.1   7612  2892 pts/0    Rs+  21:26   0:00 ps aux

とかにでpsコマンドが通った。そしたらもうコマンドをbashにすれば中に入れる

でまあ、コードをちょっと捻ったら例のアレ


Server sent charset unknown的な定番のエラー

RDSの設定を直していく

resource "aws_db_parameter_group" "custom_utf8" {
  name        = "custom-utf8-parameter-group"
  family      = "mysql8.0"
  description = "Custom RDS parameter group for UTF-8 charset"

  parameter {
    name  = "character_set_server"
    value = "utf8"
    apply_method = "immediate"
  }

  parameter {
    name  = "collation_server"
    value = "utf8_general_ci"
    apply_method = "immediate"
  }
}


とかを作って割り当てた。

まあそんなもんか。

この記事が気に入ったらサポートをしてみませんか?