とある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がモモモッて出てくるので
ここで確認が可能だ。これが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にすれば中に入れる
でまあ、コードをちょっと捻ったら例のアレ
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"
}
}
とかを作って割り当てた。
まあそんなもんか。