var streambot = require('..');var streambot = require('..');In order to use Streambot, you must “install” it by running one instance of
this template in your AWS account. This creates two Lambda function which
your own custom stacks can all on via custom CloudFormation resources. It
also creates one DynamoDB table which must be called streambot-env where
runtime configurations for your Lambda functions are stored.
It must be run in us-east-1, because the DynamoDB table must be in a very
well-known location.
module.exports = {
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Streambot Lambda functions", "Parameters": {Providing the Git SHA or version number of Streambot here insures that your Lambda functions are created using the expected version of Streambot.
"GitSha": {
"Type": "String",
"Description": "The GitSha of Streambot to deploy"
}
},The stack creates two Lambda functions, and two IAM roles for those Lambda functions to assume, and one DynamoDB table.
"Resources": {This DynamoDB table contains runtime configuration settings for your Lambda functions.
"StreambotEnvTable": {
"Type": "AWS::DynamoDB::Table",
"DeletionPolicy" : "Retain",
"Properties": {It is important that this table name be hard-wired. Otherwise Lambda functions will not know where to look for their configuration.
"TableName": streambot.tableName,
"AttributeDefinitions": [
{
"AttributeName": "name",
"AttributeType": "S"
}
],
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "name"
}
],
"ProvisionedThroughput": {
"ReadCapacityUnits": "10",
"WriteCapacityUnits": "10"
}
}
}, "StreambotEnvRole": {
"Type": "AWS::IAM::Role",
"Properties": { "Path": "/streambot/",
"AssumeRolePolicyDocument": {
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
},
"Policies": [
{Defines the permissions that the Lambda function will have once it has assumed this role.
"PolicyName": "StreambotEnvPolicy",
"PolicyDocument": {
"Statement": [ {
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
}, {
"Effect": "Allow",
"Action": [
"dynamodb:PutItem",
"dynamodb:DeleteItem"
],
"Resource": {
"Fn::Join": [
"", [
"arn:aws:dynamodb:",
{
"Ref": "StreambotEnvTable"
},
":",
{
"Ref": "AWS::AccountId"
},
":table/",
{
"Ref": "StreambotEnvTable"
},
"*"
]
]
}
}
]
}
}
]
}
},This function is intended to be run by a custom CloudFormation resource, and it is used to write a configuration file to S3.
"StreambotEnvFunction": {
"Type" : "AWS::Lambda::Function",
"Properties" : {.zip file containing
Streambot’s index.js file. "Code" : {
"S3Bucket": {
"Fn::Join": [
"-",
[
"mapbox",
{
"Ref": "AWS::Region"
}
]
]
},
"S3Key": {
"Fn::Join": [
"",
[
"release/streambot/",
{
"Ref": "GitSha"
},
".zip"
]
]
}
},index.js this Lambda function should execute. This should
always be set to index.env. "Handler" : "index.env", "Role" : {
"Fn::GetAtt": [
"StreambotEnvRole",
"Arn"
]
}, "Runtime" : "nodejs",
"Description" : "Builds runtime environment for Lambda functions",
"MemorySize" : 128,
"Timeout" : 10
}
}, "StreambotConnectorRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"Path": "/streambot/", "AssumeRolePolicyDocument": {
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
},
"Policies": [
{Defines the permissions that the Lambda function will have once it has assumed this role.
"PolicyName": "StreambotConnectorPolicy",
"PolicyDocument": {
"Statement": [ {
"Effect": "Allow",
"Action": [
"logs:*"
],
"Resource": "arn:aws:logs:*:*:*"
}, {
"Effect": "Allow",
"Action": [
"lambda:CreateEventSourceMapping",
"lambda:GetEventSourceMapping",
"lambda:UpdateEventSourceMapping",
"lambda:DeleteEventSourceMapping",
"lambda:ListEventSourceMappings"
],
"Resource": "*"
}
]
}
}
]
}
},This function is intended to be run by a custom CloudFormation resource, and it is used to manage event source mappings between Kinesis/DynamoDB streams and Lambda functions.
"StreambotConnectorFunction": {
"Type" : "AWS::Lambda::Function",
"Properties" : {.zip file containing
Streambot’s index.js file. "Code" : {
"S3Bucket": {
"Fn::Join": [
"-",
[
"mapbox",
{
"Ref": "AWS::Region"
}
]
]
},
"S3Key": {
"Fn::Join": [
"",
[
"release/streambot/",
{
"Ref": "GitSha"
},
".zip"
]
]
}
},index.js this Lambda function should execute. This should always be set to index.env. "Handler" : "index.connector", "Role" : {
"Fn::GetAtt": [
"StreambotConnectorRole",
"Arn"
]
}, "Description" : "Create event source mappings between streams and Lambda functions",
"MemorySize" : 128,
"Runtime" : "nodejs",
"Timeout" : 10
}
}
},For convenience, the Streambot stack provides outputs for values you will need in order to implement Lambda-backed services.
"Outputs": {This will be referenced by custom CloudFormation resources in your service templates.
"StreambotEnvFunctionName": {
"Value": {
"Ref": "StreambotEnvFunction"
}
}, "StreambotEnvFunctionArn": {
"Value": {
"Fn::GetAtt": [
"StreambotEnvFunction",
"Arn"
]
}
},This will be referenced by custom CloudFormation resources in your service templates.
"StreambotConnectorFunctionName": {
"Value": {
"Ref": "StreambotConnectorFunction"
}
}, "StreambotConnectorFunctionArn": {
"Value": {
"Fn::GetAtt": [
"StreambotConnectorFunction",
"Arn"
]
}
}
}
};