View a markdown version of this page

Example: DynamoDB, CloudWatch, and SNS - AWS Elastic Beanstalk

Example: DynamoDB, CloudWatch, and SNS

This configuration file sets up the DynamoDB table as a session handler for a PHP-based application using the AWS SDK for PHP 2. To use this example, you must have an IAM instance profile, which is added to the instances in your environment and used to access the DynamoDB table.

You can download the sample that we'll use in this step at DynamoDB session Support example. The sample contains the following files:

  • The sample application, index.php

  • A configuration file, dynamodb.config, to create and configure a DynamoDB table and other AWS resources and install software on the EC2 instances that host the application in an Elastic Beanstalk environment

  • A configuration file, options.config, that overrides the defaults in dynamodb.config with specific settings for this particular installation

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 the sample configuration file, we first create the DynamoDB table and configure the primary key structure for the table and the capacity units to allocate sufficient resources to provide the requested throughput. Next, we create CloudWatch alarms for WriteCapacity and ReadCapacity. We create an SNS topic that sends email to "nobody@amazon.com" if the alarm thresholds are breached.

After we create and configure our AWS resources for our environment, we need to customize the EC2 instances. We use the files key to pass the details of the DynamoDB table to the EC2 instances in our environment as well as add a "require" in the composer.json file for the AWS SDK for PHP 2. Finally, we run container commands to install composer, the required dependencies, and then remove the installer.

.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

Replace the SessionAlarmEmail value with the email where you want alarm notifications sent. The options.config file contains the values used for some of the variables defined in dynamodb.config. For example, dynamodb.config contains the following lines:

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

These lines that tell Elastic Beanstalk to get the value for the Endpoint property from the SessionAlarmEmail value in a config file (options.config in our sample application) that contains an option_settings section with an aws:elasticbeanstalk:customoption section that contains a name-value pair that contains the actual value to use. In the example above, this means SessionAlarmEmail would be assigned the value nobody@amazon.com.

For more information about the CloudFormation resources used in this example, see the following references:

Warning Javascript is disabled or is unavailable in your browser.

To use the Amazon Web Services Documentation, Javascript must be enabled. Please refer to your browser's Help pages for instructions.

Did this page help you? - Yes

Thanks for letting us know we're doing a good job!

If you've got a moment, please tell us what we did right so we can do more of it.

Did this page help you? - No

Thanks for letting us know this page needs work. We're sorry we let you down.

If you've got a moment, please tell us how we can make the documentation better.

AltStyle によって変換されたページ (->オリジナル) /