PHPでDocker環境で作成したCTFをAWSで構築&デプロイしてみた
デプロイしたいDocker環境を用意してね
*今回はdocker-compose.ymlを使用してデプロイする
AWS ECR設定
# ECRにログインしておく
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <accountID>.dkr.ecr.<region>.amazonaws.com
# ローカルでDockerを立ち上げる
docker-compose up --build
# 立ち上げたDockerのImageを取得
docker images
# タグの設定
docker tag <dockerImageId> <accountID>.dkr.ecr.<region>.amazonaws.com/<repositoryName>:<tagName>
# ECRにプッシュ
docker push <accountID>.dkr.ecr.<region>.amazonaws.com/<repositoryName>:<tagName>
AWS ECS設定
# ECSクラスターの作成
クラスター名: ClusterName
インフラストラクチャ: AWS Fargate
# ECSタスクの作成
タスク名: taskName
起動タイプ: AWS Fargate
OS: ARM64
タスク実行ロール: ecsTaskExecutionRole(AmazonECSTaskExecutionRolePolicyを使用)
コンテナ名: container
イメージURI: <ECRにプッシュしたURI>
ポートマッピング: Dockerで使用したいポートを解放 [22 : 1234 none]etc
作成
PHPファイルの作成
# ディレクトリ構成
/PHP
│
├── index.php
├── vendor/
├── composer.json
└── .env
# index.php(startボタンを押したら起動するようにした)
<?php
require 'vendor/autoload.php';
use Aws\Ecs\EcsClient;
use Aws\Exception\AwsException;
use Dotenv\Dotenv;
// .envファイルの読み込み
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
// AWSクライアントの作成
$ecsClient = new EcsClient([
'version' => 'latest',
'region' => '<region>',
'credentials' => [
'key' => $_ENV['AWS_ACCESS_KEY_ID'],
'secret' => $_ENV['AWS_SECRET_ACCESS_KEY'],
],
]);
$userId = $_ENV['USER_ID'];
if (isset($_POST['start'])) {
try {
$result = $ecsClient->runTask([
'cluster' => 'ClusterName', //クラスター名
'launchType' => 'FARGATE',
'taskDefinition' => 'taskName:1', //タスク定義:修正
'overrides' => [
'containerOverrides' => [
[
'name' => 'container', //タスク定義のコンテナ名
'environment' => [
['name' => 'USER_ID', 'value' => $userId],
],
],
],
],
'networkConfiguration' => [
'awsvpcConfiguration' => [
'subnets' => ['<subnetID>'],
'securityGroups' => ['<securityGroupsID>'],
'assignPublicIp' => 'ENABLED',
],
],
]);
} catch (AwsException $e) {
echo 'Error: ' . $e->getMessage() . PHP_EOL;
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>start</title>
</head>
<body>
<form action="" method="POST">
<button type="submit" name="start" value="start">START</button>
</form>
</body>
</html>
# composer.json
{
"name": "vendor-name/project-name",
"description": "A project to run ECS tasks",
"require": {
"aws/aws-sdk-php": "^3.0",
"vlucas/phpdotenv": "^5.0"
},
"autoload": {
"psr-4": {
"": "ecs/"
}
}
}
# .env(実際に運用するときの値は自分で設定してね)
AWS_ACCESS_KEY_ID="<aws access key>"
AWS_SECRET_ACCESS_KEY="<aws secret access key>"
USER_ID="test123"
ファイル作成後
# ターミナルでvendor/に必要なフォルダが作成される
compose install
STARTボタンを押してAWSコンソールを確認
クラスターのタスクに追加されてるはず、USER_IDを変えると2つ目3つ目とタスクが追加されていくよ。後は、みんなの環境に合わせてね^^
次はタスクを自動で停止する処理を作ってみる予定!!