見出し画像

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つ目とタスクが追加されていくよ。後は、みんなの環境に合わせてね^^

次はタスクを自動で停止する処理を作ってみる予定!!

いいなと思ったら応援しよう!