Hello! This article is also available in English!

Surf In The Cloud: TYPO3 Surf-Deployments nach EC2

Nachdem mir in den letzten Tagen das manuelle Deployment meiner kleinen Neos-Seite zu aufwändig wurde, beschloss ich, dieses Deployment über TYPO3 Surf zu automatisieren. Da ich auch beruflich viel mit Surf zu tun habe, war das Deployment schnell geschrieben. Dennoch war ich mit der ersten Version meines Deployments noch nicht ganz glücklich:

1
2
3
4
5
6
7
<?php

$node = new \TYPO3\Surf\Domain\Model\Node("i-54932495");
$node->setHostname("ec2-52-28-61-14.eu-central-1.compute.amazonaws.com");
$node->setOption("username", "neos");

// ...

Was würde passieren, wenn ich meine winzige Micro-EC2-Instanz einmal löschen würde? Oder falls ich beschlösse, meine Seite auf zwei (winzigen) Micro-Instanzen zu betreiben? Deutlich eleganter ist es, sich diese Informationen einfach direkt von der EC2-API zu laden. Hierzu kann das AWS-SDK für PHP genutzt werden, welches einfach per Composer bezogen werden kann:

$ composer require aws/aws-sdk-php

Und nun zahlt sich auch aus, dass Deployment-Definitionen in TYPO3 Surf einfach nur einfache PHP-Dateien sind. So kann man einfach alle Instanzen (optional gefiltert nach einem bestimmten Tag) aus der AWS-API laden und als Node dem Deployment hinzufügen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$ec2 = \Aws\Ec2\Ec2Client::factory(['profile' => 'default', 'region' => 'eu-central-1']);

$response = $ec2->describeInstances([
    'Filters' => [
        ['Name' => 'tag:purpose', 'Values' => ['mhde-prod']],
        ['Name' => 'instance-state-name', 'Values' => ['running']]
    ]
]);

$application = new \TYPO3\Surf\Application\TYPO3\Flow('martin-helmich.de');

foreach ($response['Reservations'] as $reservation) {
    foreach ($reservation['Instances'] as $instance) {
        $node = new \TYPO3\Surf\Domain\Model\Node($instance['InstanceId']);
        $node->setHostname($instance['PublicDnsName']);
        $node->setOption('username', 'neos');
        $application->addNode($node);
    }
}

// ...

Und fertig! Nie wieder neue Server im Deployment konfigurieren.

Kommentare