Beispiel: DynamoDB, CloudWatch und SNS - AWS Elastic Beanstalk

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispiel: DynamoDB, CloudWatch und SNS

Diese Konfigurationsdatei richtet die DynamoDB-Tabelle als Session Handler für eine PHP-basierte Anwendung mit dem AWS SDK for PHP 2 ein. Wenn Sie dieses Beispiel verwenden möchten, müssen Sie ein IAM-Instance-Profil haben, das zu den Instances in Ihrer Umgebung hinzugefügt und für den Zugriff auf die DynamoDB-Tabelle verwendet wird.

Sie können das in diesem Schritt verwendete Beispiel unter DynamoDB Session Support-Beispiel herunterladen. Das Beispiel enthält die folgenden Dateien:

  • Die Beispielanwendung, index.php

  • Eine Konfigurationsdatei, dynamodb.config, um eine DynamoDB-Tabelle und andere AWS-Ressourcen zu erstellen und zu konfigurieren sowie Software auf den EC2-Instances zu installieren, die die Anwendung in einer Elastic-Beanstalk-Umgebung hosten

  • Die Konfigurationsdatei options.config, die die Standardwerte in dynamodb.config mit spezifischen Einstellungen für diese bestimmte Installation überschreibt

index.php

<?php // Include the SDK using the Composer autoloader require '../vendor/autoload.php'; use Aws\DynamoDb\DynamoDbClient; // Grab the session table name and region from the configuration file list($tableName, $region) = file(__DIR__ . '/../sessiontable'); $tableName = rtrim($tableName); $region = rtrim($region); // Create a DynamoDB client and register the table as the session handler $dynamodb = DynamoDbClient::factory(array('region' => $region)); $handler = $dynamodb->registerSessionHandler(array('table_name' => $tableName, 'hash_key' => 'username')); // Grab the instance ID so we can display the EC2 instance that services the request $instanceId = file_get_contents("http://169.254.169.254/latest/meta-data/instance-id"); ?> <h1>Elastic Beanstalk PHP Sessions Sample</h1> <p>This sample application shows the integration of the Elastic Beanstalk PHP container and the session support for DynamoDB from the AWS SDK for PHP 2. Using DynamoDB session support, the application can be scaled out across multiple web servers. For more details, see the <a href="https://aws.amazon.com/php/">PHP Developer Center</a>.</p> <form id="SimpleForm" name="SimpleForm" method="post" action="index.php"> <?php echo 'Request serviced from instance ' . $instanceId . '<br/>'; echo '<br/>'; if (isset($_POST['continue'])) { session_start(); $_SESSION['visits'] = $_SESSION['visits'] + 1; echo 'Welcome back ' . $_SESSION['username'] . '<br/>'; echo 'This is visit number ' . $_SESSION['visits'] . '<br/>'; session_write_close(); echo '<br/>'; echo '<input type="Submit" value="Refresh" name="continue" id="continue"/>'; echo '<input type="Submit" value="Delete Session" name="killsession" id="killsession"/>'; } elseif (isset($_POST['killsession'])) { session_start(); echo 'Goodbye ' . $_SESSION['username'] . '<br/>'; session_destroy(); echo 'Username: <input type="text" name="username" id="username" size="30"/><br/>'; echo '<br/>'; echo '<input type="Submit" value="New Session" name="newsession" id="newsession"/>'; } elseif (isset($_POST['newsession'])) { session_start(); $_SESSION['username'] = $_POST['username']; $_SESSION['visits'] = 1; echo 'Welcome to a new session ' . $_SESSION['username'] . '<br/>'; session_write_close(); echo '<br/>'; echo '<input type="Submit" value="Refresh" name="continue" id="continue"/>'; echo '<input type="Submit" value="Delete Session" name="killsession" id="killsession"/>'; } else { echo 'To get started, enter a username.<br/>'; echo '<br/>'; echo 'Username: <input type="text" name="username" id="username" size="30"/><br/>'; echo '<input type="Submit" value="New Session" name="newsession" id="newsession"/>'; } ?> </form>

.ebextensions/dynamodb.config

Resources: SessionTable: Type: AWS::DynamoDB::Table Properties: KeySchema: HashKeyElement: AttributeName: Fn::GetOptionSetting: OptionName : SessionHashKeyName DefaultValue: "username" AttributeType: Fn::GetOptionSetting: OptionName : SessionHashKeyType DefaultValue: "S" ProvisionedThroughput: ReadCapacityUnits: Fn::GetOptionSetting: OptionName : SessionReadCapacityUnits DefaultValue: 1 WriteCapacityUnits: Fn::GetOptionSetting: OptionName : SessionWriteCapacityUnits DefaultValue: 1 SessionWriteCapacityUnitsLimit: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, " write capacity limit on the session table." ]]} Namespace: "AWS/DynamoDB" MetricName: ConsumedWriteCapacityUnits Dimensions: - Name: TableName Value: { "Ref" : "SessionTable" } Statistic: Sum Period: 300 EvaluationPeriods: 12 Threshold: Fn::GetOptionSetting: OptionName : SessionWriteCapacityUnitsAlarmThreshold DefaultValue: 240 ComparisonOperator: GreaterThanThreshold AlarmActions: - Ref: SessionAlarmTopic InsufficientDataActions: - Ref: SessionAlarmTopic SessionReadCapacityUnitsLimit: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, " read capacity limit on the session table." ]]} Namespace: "AWS/DynamoDB" MetricName: ConsumedReadCapacityUnits Dimensions: - Name: TableName Value: { "Ref" : "SessionTable" } Statistic: Sum Period: 300 EvaluationPeriods: 12 Threshold: Fn::GetOptionSetting: OptionName : SessionReadCapacityUnitsAlarmThreshold DefaultValue: 240 ComparisonOperator: GreaterThanThreshold AlarmActions: - Ref: SessionAlarmTopic InsufficientDataActions: - Ref: SessionAlarmTopic SessionThrottledRequestsAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: { "Fn::Join" : ["", [{ "Ref" : "AWSEBEnvironmentName" }, ": requests are being throttled." ]]} Namespace: AWS/DynamoDB MetricName: ThrottledRequests Dimensions: - Name: TableName Value: { "Ref" : "SessionTable" } Statistic: Sum Period: 300 EvaluationPeriods: 1 Threshold: Fn::GetOptionSetting: OptionName: SessionThrottledRequestsThreshold DefaultValue: 1 ComparisonOperator: GreaterThanThreshold AlarmActions: - Ref: SessionAlarmTopic InsufficientDataActions: - Ref: SessionAlarmTopic SessionAlarmTopic: Type: AWS::SNS::Topic Properties: Subscription: - Endpoint: Fn::GetOptionSetting: OptionName: SessionAlarmEmail DefaultValue: "nobody@amazon.com" Protocol: email files: "/var/app/sessiontable": mode: "000444" content: | `{"Ref" : "SessionTable"}` `{"Ref" : "AWS::Region"}` "/var/app/composer.json": mode: "000744" content: { "require": { "aws/aws-sdk-php": "*" } } container_commands: "1-install-composer": command: "cd /var/app; curl -s http://getcomposer.org/installer | php" "2-install-dependencies": command: "cd /var/app; php composer.phar install" "3-cleanup-composer": command: "rm -Rf /var/app/composer.*"

In der Beispielkonfigurationsdatei erstellen wir zunächst die DynamoDB-Tabelle und konfigurieren die Primärschlüssel-Struktur für die Tabelle und die Kapazitätseinheiten, um ausreichend Ressourcen zuzuweisen, um den angeforderten Durchsatz zu bieten. Als Nächstes erstellen wir CloudWatch-Alarme für WriteCapacity und ReadCapacity. Wir erstellen ein SNS-Thema, das eine E-Mail an "nobody@amazon.com" sendet, wenn die Alarmschwellenwerte überschritten werden.

Nachdem wir unsere AWS-Ressourcen für unsere Umgebung erstellt und konfiguriert haben, müssen wir die EC2-Instances anpassen. Wir verwenden den files-Schlüssel, um die Details der DynamoDB-Tabelle an die EC2-Instances in unserer Umgebung zu übergeben und ein „require“ in der composer.json-Datei für das AWS SDK for PHP 2 hinzuzufügen. Schließlich führen wir Container-Befehle aus, um den Composer und die erforderlichen Abhängigkeiten zu installieren und das Installationsprogramm zu entfernen.

.ebextensions/options.config

option_settings: "aws:elasticbeanstalk:customoption": SessionHashKeyName : username SessionHashKeyType : S SessionReadCapacityUnits : 1 SessionReadCapacityUnitsAlarmThreshold : 240 SessionWriteCapacityUnits : 1 SessionWriteCapacityUnitsAlarmThreshold : 240 SessionThrottledRequestsThreshold : 1 SessionAlarmEmail : me@example.com

Ersetzen Sie den SessionAlarmEmail-Wert durch die E-Mail, an die Alarmbenachrichtigungen gesendet werden sollen. Die options.config-Datei enthält die Werte, die für einige der in dynamodb.config definierten Variablen verwendet werden. Beispielsweise enthält dynamodb.config die folgenden Zeilen:

Subscription: - Endpoint: Fn::GetOptionSetting: OptionName: SessionAlarmEmail DefaultValue: "nobody@amazon.com"

Mit diesen Zeilen wird Elastic Beanstalk angewiesen, den Wert für die Eigenschaft Endpoint aus dem Wert SessionAlarmEmail in einer Konfigurationsdatei (in unserer Beispielanwendung options.config) abzurufen. Diese enthält im Bereich „option_settings“ den Abschnitt aws:elasticbeanstalk:customoption mit einem Name-Wert-Paar, in dem sich der zu verwendende Wert befindet. Im obigen Beispiel bedeutet dies, dass SessionAlarmEmail der Wert nobody@amazon.com zugewiesen würde.

Weitere Informationen zu den CloudFormation-Ressourcen, die in diesem Beispiel verwendet wurden, finden Sie unter folgenden Referenzen: