github.com/mweagle/Sparta@v1.15.0/docs/index.xml (about) 1 <?xml version="1.0" encoding="utf-8" standalone="yes"?> 2 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> 3 <channel> 4 <title>Sparta - AWS Lambda Microservices</title> 5 <link>/</link> 6 <description>Recent content on Sparta - AWS Lambda Microservices</description> 7 <generator>Hugo -- gohugo.io</generator> 8 <language>en-US</language> 9 <lastBuildDate>Tue, 08 Mar 2016 21:07:13 +0100</lastBuildDate> 10 11 <atom:link href="/index.xml" rel="self" type="application/rss+xml" /> 12 13 14 <item> 15 <title>Magefiles</title> 16 <link>/reference/operations/magefile/</link> 17 <pubDate>Wed, 28 Nov 2018 16:17:43 +0000</pubDate> 18 19 <guid>/reference/operations/magefile/</guid> 20 <description>Magefile To support cross platform development and usage, Sparta uses magefiles rather than Makefiles. Most projects can start with the magefile.go sample below. The Magefiles provide a discoverable CLI, but are entirely optional. go run main.go XXXX style invocation remains available as well. 21 Default Sparta magefile.go This magefile.go can be used, unchanged, for most standard Sparta projects. 22 // +build mage // File: magefile.go package main import ( spartaMage &#34;github.</description> 23 </item> 24 25 <item> 26 <title>Event Bridge</title> 27 <link>/reference/archetypes/event_bridge/</link> 28 <pubDate>Sat, 22 Feb 2020 17:36:59 +0000</pubDate> 29 30 <guid>/reference/archetypes/event_bridge/</guid> 31 <description>The EventBridge lambda event source allows you to trigger lambda functions in response to either cron schedules or account events. There are two different archetype functions available. 32 Scheduled Scheduled Lambdas execute either at fixed times or periodically depending on the schedule expression. 33 To create a scheduled function use a constructor as in: 34 import ( spartaArchetype &#34;github.com/mweagle/Sparta/archetype&#34; ) // EventBridge reactor function func echoEventBridgeEvent(ctx context.Context, msg json.RawMessage) (interface{}, error) { logger, _ := ctx.</description> 35 </item> 36 37 <item> 38 <title>Application Load Balancer</title> 39 <link>/reference/decorators/application_load_balancer/</link> 40 <pubDate>Sat, 10 Aug 2019 14:59:12 +0000</pubDate> 41 42 <guid>/reference/decorators/application_load_balancer/</guid> 43 <description>The ApplicationLoadBalancerDecorator allows you to expose lambda functions as Application Load Balancer targets. 44 This can be useful to provide HTTP(S) access to one or more Lambda functions without requiring an API-Gateway service. 45 Lambda Function Application Load Balancer (ALB) lambda targets must satisfy a prescribed Lambda signature: 46 import ( awsEvents &#34;github.com/aws/aws-lambda-go/events&#34; ) func(context.Context, awsEvents.ALBTargetGroupRequest) awsEvents.ALBTargetGroupResponse See the ALBTargetGroupRequest and ALBTargetGroupResponse godoc entries for more information. 47 An example ALB-eligible target function might look like:</description> 48 </item> 49 50 <item> 51 <title>CloudMap Service Discovery</title> 52 <link>/reference/decorators/cloudmap/</link> 53 <pubDate>Mon, 27 May 2019 22:31:25 +0000</pubDate> 54 55 <guid>/reference/decorators/cloudmap/</guid> 56 <description>The CloudMapServiceDecorator allows your service to register a service instance for your application. 57 For example, an application that provisions a SQS queue and an AWS Lambda function that consumes messages from that queue may need a way for the Lambda function to discover the dynamically provisioned queue. 58 Sparta supports an environment-based discovery service but that discovery is limited to a single Service. 59 The CloudMapServiceDecorator leverages the CloudMap service to support intra- and inter-service resource discovery.</description> 60 </item> 61 62 <item> 63 <title>CodeCommit</title> 64 <link>/reference/archetypes/codecommit/</link> 65 <pubDate>Thu, 31 Jan 2019 05:47:27 +0000</pubDate> 66 67 <guid>/reference/archetypes/codecommit/</guid> 68 <description>The CodeCommit Lambda event source allows you to trigger lambda functions in response to CodeCommit repository events. 69 Events Lambda functions triggered in response to CodeCommit evetms use a combination of events and branches to manage which state changes trigger your lambda function. 70 To create an event subscriber use a constructor as in: 71 // CodeCommit reactor function func reactorFunc(ctx context.Context, event awsLambdaEvents.CodeCommitEvent) (interface{}, error) { logger, _ := ctx.Value(sparta.ContextKeyRequestLogger).(*logrus.Entry) logger.WithFields(logrus.Fields{ &#34;Event&#34;: event, }).</description> 72 </item> 73 74 <item> 75 <title>CodeCommit</title> 76 <link>/reference/eventsources/codecommit/</link> 77 <pubDate>Thu, 31 Jan 2019 05:44:32 +0000</pubDate> 78 79 <guid>/reference/eventsources/codecommit/</guid> 80 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to CodeCommit Events. 81 Goal Assume that we&rsquo;re supposed to write a Lambda function that is triggered in response to any event emitted by a CodeCommit repository. 82 Getting Started Our lambda function is relatively short: 83 import ( awsLambdaEvents &#34;github.com/aws/aws-lambda-go/events&#34; ) func echoCodeCommit(ctx context.Context, event awsLambdaEvents.CodeCommitEvent) (interface{}, error) { logger, _ := ctx.Value(sparta.ContextKeyRequestLogger).(*logrus.Entry) logger.WithFields(logrus.Fields{ &#34;Event&#34;: event, }).Info(&#34;Event received&#34;) return &amp;event, nil } Our lambda function doesn&rsquo;t need to do much with the repository message other than log and return it.</description> 84 </item> 85 86 <item> 87 <title>Amazon DynamoDb</title> 88 <link>/reference/step/services/dynamodb/</link> 89 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 90 91 <guid>/reference/step/services/dynamodb/</guid> 92 <description> TODO: Document Dynamo integration. 93 </description> 94 </item> 95 96 <item> 97 <title>Amazon SageMaker</title> 98 <link>/reference/step/services/sagemaker/</link> 99 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 100 101 <guid>/reference/step/services/sagemaker/</guid> 102 <description> TODO: Document SageMaker integration. 103 </description> 104 </item> 105 106 <item> 107 <title>Amazon SNS</title> 108 <link>/reference/step/services/sns/</link> 109 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 110 111 <guid>/reference/step/services/sns/</guid> 112 <description> TODO: Document SNS integration. 113 </description> 114 </item> 115 116 <item> 117 <title>Amazon SQS</title> 118 <link>/reference/step/services/sqs/</link> 119 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 120 121 <guid>/reference/step/services/sqs/</guid> 122 <description> TODO: Document SQS integration. 123 </description> 124 </item> 125 126 <item> 127 <title>AWS Batch</title> 128 <link>/reference/step/services/batch/</link> 129 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 130 131 <guid>/reference/step/services/batch/</guid> 132 <description> TODO: Document Batch integration. 133 </description> 134 </item> 135 136 <item> 137 <title>AWS Fargate</title> 138 <link>/reference/step/services/fargate/</link> 139 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 140 141 <guid>/reference/step/services/fargate/</guid> 142 <description> TODO: Document Fargate integration. 143 </description> 144 </item> 145 146 <item> 147 <title>AWS Glue</title> 148 <link>/reference/step/services/glue/</link> 149 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 150 151 <guid>/reference/step/services/glue/</guid> 152 <description> TODO: Document Glue integration. 153 </description> 154 </item> 155 156 <item> 157 <title>Lambda</title> 158 <link>/reference/step/lambda/</link> 159 <pubDate>Mon, 10 Dec 2018 21:45:23 +0000</pubDate> 160 161 <guid>/reference/step/lambda/</guid> 162 <description>Step Functions AWS Step Functions are a powerful way to express long-running, complex workflows comprised of Lambda functions. With Sparta 0.20.2, you can build a State Machine as part of your application. This section walks through the three steps necessary to provision a sample &ldquo;Roll Die&rdquo; state machine using a single Lambda function. See SpartaStep for the full source. 163 Lambda Functions The first step is to define the core Lambda function Task that will be our Step function&rsquo;s core logic.</description> 164 </item> 165 166 <item> 167 <title>XRayInterceptor</title> 168 <link>/reference/interceptors/xray_interceptor/</link> 169 <pubDate>Sat, 01 Dec 2018 06:24:24 +0000</pubDate> 170 171 <guid>/reference/interceptors/xray_interceptor/</guid> 172 <description>TODO: Document the XRayInterceptor 173 🎉 Sparta v1.7.0: The Time Machine Edition 🕰 🎉 For those times when you wish you could go back in time and enable debug logging for a single request.https://t.co/BP60qQpKva#serverless #go 174 &mdash; Matt Weagle (@mweagle) November 12, 2018 Sparta v1.7.0 adds `Interceptors`: user defined hooks called during the lambda event handling flow to support cross-cutting concerns. The first interceptor is an XRay annotation and metadata interceptor.</description> 175 </item> 176 177 <item> 178 <title>CloudWatch</title> 179 <link>/reference/archetypes/cloudwatch/</link> 180 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 181 182 <guid>/reference/archetypes/cloudwatch/</guid> 183 <description>The CloudWatch Logs Lambda event source allows you to trigger lambda functions in response to either cron schedules or account events. There are three different archetype functions available. 184 Scheduled Scheduled Lambdas execute either at fixed times or periodically depending on the schedule expression. 185 To create a scheduled function use a constructor as in: 186 import ( awsLambdaEvents &#34;github.com/aws/aws-lambda-go/events&#34; spartaArchetype &#34;github.com/mweagle/Sparta/archetype&#34; ) // CloudWatch reactor function func reactorFunc(ctx context.Context, cwLogs awsLambdaEvents.CloudwatchLogsEvent) (interface{}, error) { logger, _ := ctx.</description> 187 </item> 188 189 <item> 190 <title>DynamoDB</title> 191 <link>/reference/archetypes/dynamodb/</link> 192 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 193 194 <guid>/reference/archetypes/dynamodb/</guid> 195 <description>To create a DynamoDB reactor that subscribes via an EventSourceMapping, use the NewDynamoDBReactor constructor as in: 196 import ( awsLambdaEvents &#34;github.com/aws/aws-lambda-go/events&#34; spartaArchetype &#34;github.com/mweagle/Sparta/archetype&#34; ) // DynamoDB reactor function func reactorFunc(ctx context.Context, dynamoEvent awsLambdaEvents.DynamoDBEvent) (interface{}, error) { logger, _ := ctx.Value(sparta.ContextKeyRequestLogger).(*logrus.Entry) logger.WithFields(logrus.Fields{ &#34;Event&#34;: dynamoEvent, }).Info(&#34;DynamoDB Event&#34;) return &#34;Hello World 👋. Welcome to AWS Lambda! 🙌🎉🍾&#34;, nil } func main() { // ... handler := spartaArchetype.DynamoDBReactorFunc(reactorFunc) lambdaFn, lambdaFnErr := spartaArchetype.NewDynamoDBReactor(handler, &#34;DYNAMO_DB_ARN_OR_CLOUDFORMATION_REF_VALUE&#34;, &#34;TRIM_HORIZON&#34;, 10, nil) } </description> 197 </item> 198 199 <item> 200 <title>Kinesis</title> 201 <link>/reference/archetypes/kinesis/</link> 202 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 203 204 <guid>/reference/archetypes/kinesis/</guid> 205 <description>To create a Kinesis Stream reactor that subscribes via an EventSourceMapping, use the NewKinesisReactor constructor as in: 206 import ( awsLambdaEvents &#34;github.com/aws/aws-lambda-go/events&#34; spartaArchetype &#34;github.com/mweagle/Sparta/archetype&#34; ) // KinesisStream reactor function func reactorFunc(ctx context.Context, kinesisEvent awsLambdaEvents.KinesisEvent) (interface{}, error) { logger, _ := ctx.Value(sparta.ContextKeyRequestLogger).(*logrus.Entry) logger.WithFields(logrus.Fields{ &#34;Event&#34;: kinesisEvent, }).Info(&#34;Kinesis Event&#34;) return &#34;Hello World 👋. Welcome to AWS Lambda! 🙌🎉🍾&#34;, nil } func main() { // ... handler := spartaArchetype.KinesisReactorFunc(reactorFunc) lambdaFn, lambdaFnErr := spartaArchetype.NewKinesisReactor(handler, &#34;KINESIS_STREAM_ARN_OR_CLOUDFORMATION_REF_VALUE&#34;, &#34;TRIM_HORIZON&#34;, 10, nil) } </description> 207 </item> 208 209 <item> 210 <title>Kinesis Firehose</title> 211 <link>/reference/archetypes/kinesis_firehose/</link> 212 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 213 214 <guid>/reference/archetypes/kinesis_firehose/</guid> 215 <description>There are two ways to create a Firehose Transform reactor that transforms a KinesisFirehoseEventRecord with a Lambda function: 216 NewKinesisFirehoseLambdaTransformer Transform using a Lambda function NewKinesisFirehoseTransformer Transform using a go text/template declaration NewKinesisFirehoseLambdaTransformer import ( awsEvents &#34;github.com/aws/aws-lambda-go/events&#34; spartaArchetype &#34;github.com/mweagle/Sparta/archetype&#34; ) // KinesisStream reactor function func reactorFunc(ctx context.Context, record *awsEvents.KinesisFirehoseEventRecord) (*awsEvents.KinesisFirehoseResponseRecord, error) { logger, _ := ctx.Value(sparta.ContextKeyRequestLogger).(*logrus.Entry) logger.WithFields(logrus.Fields{ &#34;Record&#34;: record, }).Info(&#34;Kinesis Firehose Event&#34;) responseRecord = &amp;awsEvents.</description> 217 </item> 218 219 <item> 220 <title>REST Service</title> 221 <link>/reference/archetypes/rest/</link> 222 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 223 224 <guid>/reference/archetypes/rest/</guid> 225 <description>The rest package provides convenience functions to define a serverless REST style service. 226 The package uses three concepts: 227 Routes: URL paths that resolve to a single go struct Resources: go structs that optionally define HTTP method (GET, POST, etc.). ResourceDefinition: an interface that go structs must implement in order to support resource-based registration. Routes Routes are similar many HTTP-routing libraries. They support path parameters. 228 Resources Resources are the targets of Routes.</description> 229 </item> 230 231 <item> 232 <title>S3</title> 233 <link>/reference/archetypes/s3/</link> 234 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 235 236 <guid>/reference/archetypes/s3/</guid> 237 <description>There are two different S3-based constructors depending on whether your lambda function should use an Object Key Name filter. The S3 subscriber is preconfigured to be notified of both s3:ObjectCreated:* and s3:ObjectRemoved:* events. 238 Object Key Name Filtering Object key name filtering only invokes a lambda function when objects with the given prefix are created. 239 To subscribe to object events created by objects with a given prefix, use the NewS3ScopedReactor constructor as in:</description> 240 </item> 241 242 <item> 243 <title>SNS</title> 244 <link>/reference/archetypes/sns/</link> 245 <pubDate>Wed, 28 Nov 2018 20:03:46 +0000</pubDate> 246 247 <guid>/reference/archetypes/sns/</guid> 248 <description>To create a SNS reactor that subscribes via an subscription configuration, use the NewSNSReactor constructor as in: 249 import ( awsLambdaEvents &#34;github.com/aws/aws-lambda-go/events&#34; spartaArchetype &#34;github.com/mweagle/Sparta/archetype&#34; ) // DynamoDB reactor function func reactorFunc(ctx context.Context, snsEvent awsLambdaEvents.SNSEvent) (interface{}, error) { logger, _ := ctx.Value(sparta.ContextKeyRequestLogger).(*logrus.Entry) logger.WithFields(logrus.Fields{ &#34;Event&#34;: snsEvent, }).Info(&#34;SNS Event&#34;) return &#34;Hello World 👋. Welcome to AWS Lambda! 🙌🎉🍾&#34;, nil } func main() { // ... handler := spartaArchetype.SNSReactorFunc(reactorFunc) lambdaFn, lambdaFnErr := spartaArchetype.NewDynamoDBReactor(handler, &#34;SNS_ARN_OR_CLOUDFORMATION_REF_VALUE&#34;, nil) } </description> 250 </item> 251 252 <item> 253 <title>CloudFront Distribution</title> 254 <link>/reference/decorators/cloudfront_distribution/</link> 255 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 256 257 <guid>/reference/decorators/cloudfront_distribution/</guid> 258 <description>The CloudFrontDistributionDecorator associates a CloudFront Distribution with your S3-backed website. It is implemented as a ServiceDecoratorHookHandler as a single service can only provision one CloudFront distribution. 259 Sample usage: 260 //////////////////////////////////////////////////////////////////////////////// // CloudFront settings const subdomain = &#34;mySiteSubdomain&#34; // The domain managed by Route53. const domainName = &#34;myRoute53ManagedDomain.net&#34; // The site will be available at // https://mySiteSubdomain.myRoute53ManagedDomain.net // The S3 bucketname must match the subdomain.domain // name pattern to serve as a CloudFront Distribution target var bucketName = fmt.</description> 261 </item> 262 263 <item> 264 <title>CloudWatch Alarms</title> 265 <link>/reference/operations/cloudwatch_alarms/</link> 266 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 267 268 <guid>/reference/operations/cloudwatch_alarms/</guid> 269 <description>The CloudWatchErrorAlarmDecorator associates a CloudWatch alarm and destination with your Lambda function. 270 Sample usage: 271 lambdaFn, _ := sparta.NewAWSLambda(&#34;Hello World&#34;, helloWorld, sparta.IAMRoleDefinition{}) lambdaFn.Decorators = []sparta.TemplateDecoratorHandler{ spartaDecorators.CloudWatchErrorAlarmDecorator(1, 1, 1, gocf.String(&#34;MY_SNS_ARN&#34;)), } </description> 272 </item> 273 274 <item> 275 <title>CloudWatch Dashboard</title> 276 <link>/reference/operations/cloudwatch_dashboard/</link> 277 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 278 279 <guid>/reference/operations/cloudwatch_dashboard/</guid> 280 <description>The DashboardDecorator creates a CloudWatch Dashboard that produces a single CloudWatch Dashboard to summarize your stack&rsquo;s behavior. 281 Sample usage: 282 func workflowHooks(connections *service.Connections, lambdaFunctions []*sparta.LambdaAWSInfo, websiteURL *gocf.StringExpr) *sparta.WorkflowHooks { // Setup the DashboardDecorator lambda hook workflowHooks := &amp;sparta.WorkflowHooks{ ServiceDecorators: []sparta.ServiceDecoratorHookHandler{ spartaDecorators.DashboardDecorator(lambdaFunctions, 60), serviceResourceDecorator(connections, websiteURL), }, } return workflowHooks } A sample dashboard for the SpartaGeekwire project is: 283 Related to this, see the recently announced AWS Lambda Application Dashboard.</description> 284 </item> 285 286 <item> 287 <title>CodeDeploy Service Update</title> 288 <link>/reference/operations/codedeploy_service_update/</link> 289 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 290 291 <guid>/reference/operations/codedeploy_service_update/</guid> 292 <description> TODO: Document the CodeDeployServiceUpdateDecorator decorator. See also the Deployment Strategy page. 293 </description> 294 </item> 295 296 <item> 297 <title>Lambda Versioning Decorator</title> 298 <link>/reference/decorators/lambda_versioning/</link> 299 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 300 301 <guid>/reference/decorators/lambda_versioning/</guid> 302 <description> TODO: LambdaVersioningDecorator 303 </description> 304 </item> 305 306 <item> 307 <title>Publishing Outputs</title> 308 <link>/reference/decorators/publish_outputs/</link> 309 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 310 311 <guid>/reference/decorators/publish_outputs/</guid> 312 <description>CloudFormation stack outputs can be used to advertise information about a service. 313 Sparta provides different publishing output decorators depending on the type of CloudFormation resource output: 314 Ref: PublishRefOutputDecorator Fn::Att: PublishAttOutputDecorator Publishing Resource Ref Values For example, to publish the dynamically lambda resource name for a given AWS Lambda function, use PublishRefOutputDecorator such as: 315 lambdaFunctionName := &#34;Hello World&#34; lambdaFn, _ := sparta.NewAWSLambda(lambdaFunctionName, helloWorld, sparta.IAMRoleDefinition{}) lambdaFn.Decorators = append(lambdaFn.Decorators, spartaDecorators.PublishRefOutputDecorator(fmt.Sprintf(&#34;%s FunctionName&#34;, lambdaFunctionName), fmt.</description> 316 </item> 317 318 <item> 319 <title>S3 Artifact Publisher</title> 320 <link>/reference/decorators/s3_artifact_publisher/</link> 321 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 322 323 <guid>/reference/decorators/s3_artifact_publisher/</guid> 324 <description>The S3ArtifactPublisherDecorator enables a service to publish objects to S3 locations as part of the service lifecycle. 325 This decorator is implemented as a ServiceDecoratorHookHandler which is supplied to MainEx. For example: 326 hooks := &amp;sparta.WorkflowHooks{} payloadData := map[string]interface{}{ &#34;SomeValue&#34;: gocf.Ref(&#34;AWS::StackName&#34;), } serviceHook := spartaDecorators.S3ArtifactPublisherDecorator(gocf.String(&#34;MY-S3-BUCKETNAME&#34;), gocf.Join(&#34;&#34;, gocf.String(&#34;metadata/&#34;), gocf.Ref(&#34;AWS::StackName&#34;), gocf.String(&#34;.json&#34;)), payloadData) hooks.ServiceDecorators = []sparta.ServiceDecoratorHookHandler{serviceHook} </description> 327 </item> 328 329 <item> 330 <title>Overview</title> 331 <link>/example_service/step1/</link> 332 <pubDate>Tue, 03 Oct 2017 07:15:40 +0000</pubDate> 333 334 <guid>/example_service/step1/</guid> 335 <description>Sparta is a framework for developing and deploying go based AWS Lambda-backed microservices. To help understand what that means we&rsquo;ll begin with a &ldquo;Hello World&rdquo; lambda function and eventually deploy that to AWS. Note that we&rsquo;re not going to handle all error cases to keep the example code to a minimum. 336 Please be aware that running Lambda functions may incur costs. Be sure to decommission Sparta stacks after you are finished using them (via the delete command line option) to avoid unwanted charges.</description> 337 </item> 338 339 <item> 340 <title>CI/CD</title> 341 <link>/reference/operations/cicd/</link> 342 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 343 344 <guid>/reference/operations/cicd/</guid> 345 <description> TODO: Document the SpartaCodePipeline example. Also see the Medium Post 346 </description> 347 </item> 348 349 <item> 350 <title>CloudFormation</title> 351 <link>/reference/eventsources/cloudformation/</link> 352 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 353 354 <guid>/reference/eventsources/cloudformation/</guid> 355 <description> TODO: CloudFormation source documentation 356 </description> 357 </item> 358 359 <item> 360 <title>CloudWatch Events</title> 361 <link>/reference/eventsources/cloudwatchevents/</link> 362 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 363 364 <guid>/reference/eventsources/cloudwatchevents/</guid> 365 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to different types of CloudWatch Events. This overview is based on the SpartaApplication sample code if you&rsquo;d rather jump to the end result. 366 Goal Assume that we&rsquo;re supposed to write a simple &ldquo;HelloWorld&rdquo; CloudWatch event function that has two requirements: 367 Run every 5 minutes to provide a heartbeat notification to our alerting system via a logfile entry Log EC2-related events for later processing Getting Started The lambda function is relatively small:</description> 368 </item> 369 370 <item> 371 <title>CloudWatch Logs</title> 372 <link>/reference/eventsources/cloudwatchlogs/</link> 373 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 374 375 <guid>/reference/eventsources/cloudwatchlogs/</guid> 376 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to CloudWatch Logs. This overview is based on the SpartaApplication sample code if you&rsquo;d rather jump to the end result. 377 Goal Assume that we&rsquo;re supposed to write a simple &ldquo;HelloWorld&rdquo; CloudWatch Logs function that should be triggered in response to any log message issued to a specific Log Group. 378 Getting Started Our lambda function is relatively short:</description> 379 </item> 380 381 <item> 382 <title>Cognito</title> 383 <link>/reference/eventsources/cognito/</link> 384 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 385 386 <guid>/reference/eventsources/cognito/</guid> 387 <description> TODO: Cognito source documentation 388 </description> 389 </item> 390 391 <item> 392 <title>Custom Commands</title> 393 <link>/reference/application/custom_commands/</link> 394 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 395 396 <guid>/reference/application/custom_commands/</guid> 397 <description>In addition to custom flags, an application may register completely new commands. For example, to support alternative topologies or integrated automated acceptance tests as part of a CI/CD pipeline. 398 To register a custom command, define a new cobra.Command and add it to the sparta.CommandLineOptions.Root command value. Ensure you use the xxxxE Cobra functions so that errors can be properly propagated. 399 httpServerCommand := &amp;cobra.Command{ Use: &#34;httpServer&#34;, Short: &#34;Sample HelloWorld HTTP server&#34;, Long: `Sample HelloWorld HTTP server that binds to port: ` + HTTPServerPort, RunE: func(cmd *cobra.</description> 400 </item> 401 402 <item> 403 <title>Custom Flags</title> 404 <link>/reference/application/custom_flags/</link> 405 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 406 407 <guid>/reference/application/custom_flags/</guid> 408 <description>Some commands (eg: provision) may require additional options. For instance, your application&rsquo;s provision logic may require VPC subnets or EC2 SSH Key Names. 409 The default Sparta command line option flags may be extended and validated by building on the exposed Cobra command objects. 410 Adding Flags To add a flag, use one of the pflag functions to register your custom flag with one of the standard CommandLineOption values. 411 For example: 412 // SSHKeyName is the SSH KeyName to use when provisioning new EC2 instance var SSHKeyName string func main() { // And add the SSHKeyName option to the provision step sparta.</description> 413 </item> 414 415 <item> 416 <title>DynamoDB</title> 417 <link>/reference/eventsources/dynamodb/</link> 418 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 419 420 <guid>/reference/eventsources/dynamodb/</guid> 421 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to DynamoDB stream events. This overview is based on the SpartaApplication sample code if you&rsquo;d rather jump to the end result. 422 Goal Assume that we&rsquo;re given a DynamoDB stream. See below for details on how to create the stream. We&rsquo;ve been asked to write a lambda function that logs when operations are performed to the table so that we can perform offline analysis.</description> 423 </item> 424 425 <item> 426 <title>Echo</title> 427 <link>/reference/apigateway/echo_event/</link> 428 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 429 430 <guid>/reference/apigateway/echo_event/</guid> 431 <description>To start, we&rsquo;ll create a HTTPS accessible lambda function that simply echoes back the contents of incoming API Gateway Lambda event. The source for this is the SpartaHTML. 432 For reference, the helloWorld function is below. 433 import ( awsLambdaEvents &#34;github.com/aws/aws-lambda-go/events&#34; spartaAPIGateway &#34;github.com/mweagle/Sparta/aws/apigateway&#34; ) func helloWorld(ctx context.Context, gatewayEvent spartaAWSEvents.APIGatewayRequest) (*spartaAPIGateway.Response, error) { logger, loggerOk := ctx.Value(sparta.ContextKeyLogger).(*logrus.Logger) if loggerOk { logger.Info(&#34;Hello world structured log message&#34;) } // Return a message, together with the incoming input.</description> 434 </item> 435 436 <item> 437 <title>Kinesis</title> 438 <link>/reference/eventsources/kinesis/</link> 439 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 440 441 <guid>/reference/eventsources/kinesis/</guid> 442 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to Amazon Kinesis streams. This overview is based on the SpartaApplication sample code if you&rsquo;d rather jump to the end result. 443 Goal The goal of this example is to provision a Sparta lambda function that logs Amazon Kinesis events to CloudWatch logs. 444 Getting Started We&rsquo;ll start with an empty lambda function and build up the needed functionality.</description> 445 </item> 446 447 <item> 448 <title>Managing Environments</title> 449 <link>/reference/application/environments/</link> 450 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 451 452 <guid>/reference/application/environments/</guid> 453 <description>It&rsquo;s common for a single Sparta application to target multiple environments. For example: 454 Development Staging Production Each environment is largely similar, but the application may need slightly different configuration in each context. 455 To support this, Sparta uses Go&rsquo;s conditional compilation support to ensure that configuration information is validated at build time. Conditional compilation is supported via the --tags/-t command line argument. 456 This example will work through the SpartaConfig sample.</description> 457 </item> 458 459 <item> 460 <title>S3</title> 461 <link>/reference/eventsources/s3/</link> 462 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 463 464 <guid>/reference/eventsources/s3/</guid> 465 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to S3 events. This overview is based on the SpartaImager sample code if you&rsquo;d rather jump to the end result. 466 Goal Assume we have an S3 bucket that stores images. You&rsquo;ve been asked to write a service that creates a duplicate image that includes a characteristic stamp overlay and store it in the same S3 bucket. 467 Getting Started We&rsquo;ll start with an empty lambda function and build up the needed functionality.</description> 468 </item> 469 470 <item> 471 <title>SES</title> 472 <link>/reference/eventsources/ses/</link> 473 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 474 475 <guid>/reference/eventsources/ses/</guid> 476 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to inbound email. This overview is based on the SpartaApplication sample code if you&rsquo;d rather jump to the end result. 477 Goal Assume that we have already verified our email domain with AWS. This allows our domain&rsquo;s email to be handled by SES. 478 We&rsquo;ve been asked to write a lambda function that logs inbound messages, including the metadata associated with the message body itself.</description> 479 </item> 480 481 <item> 482 <title>SNS</title> 483 <link>/reference/eventsources/sns/</link> 484 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 485 486 <guid>/reference/eventsources/sns/</guid> 487 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to SNS events. This overview is based on the SpartaApplication sample code if you&rsquo;d rather jump to the end result. 488 Goal Assume that we have an SNS topic that broadcasts notifications. We&rsquo;ve been asked to write a lambda function that logs the Subject and Message text to CloudWatch logs for later processing. 489 Getting Started We&rsquo;ll start with an empty lambda function and build up the needed functionality.</description> 490 </item> 491 492 <item> 493 <title>SQS</title> 494 <link>/reference/eventsources/sqs/</link> 495 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 496 497 <guid>/reference/eventsources/sqs/</guid> 498 <description>In this section we&rsquo;ll walkthrough how to trigger your lambda function in response to AWS Simple Queue Service (SQS) events. This overview is based on the SpartaSQS sample code if you&rsquo;d rather jump to the end result. 499 Goal The goal here is to create a self-contained service that provisions a SQS queue, an AWS Lambda function that processes messages posted to the queue 500 Getting Started We&rsquo;ll start with an empty lambda function and build up the needed functionality.</description> 501 </item> 502 503 <item> 504 <title>Request Parameters</title> 505 <link>/reference/apigateway/request_params/</link> 506 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 507 508 <guid>/reference/apigateway/request_params/</guid> 509 <description>Request Parameters This example demonstrates how to accept client request params supplied as HTTP query params and return an expiring S3 URL to access content. The source for this is the s3ItemInfo function defined as part of the SpartaApplication. 510 Lambda Definition Our function will accept two params: 511 bucketName : The S3 bucket name storing the asset keyName : The S3 item key Those params will be passed as part of the URL query string.</description> 512 </item> 513 514 <item> 515 <title>Request Context</title> 516 <link>/reference/apigateway/context/</link> 517 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 518 519 <guid>/reference/apigateway/context/</guid> 520 <description>This example demonstrates how to use the Context struct provided as part of the APIGatewayRequest. The SpartaGeoIP service will return Geo information based on the inbound request&rsquo;s IP address. 521 Lambda Definition Our function will examine the inbound request, lookup the user&rsquo;s IP address in the GeoLite2 Database and return any information to the client. 522 As this function is only expected to be invoked from the API Gateway, we&rsquo;ll unmarshall the inbound event:</description> 523 </item> 524 525 <item> 526 <title>Fargate</title> 527 <link>/reference/step/fargate/</link> 528 <pubDate>Sun, 16 Dec 2018 07:02:28 +0000</pubDate> 529 530 <guid>/reference/step/fargate/</guid> 531 <description>Teaching people to do serverless is hard. It&#39;s far less about teaching someone about FaaS and far more about getting people into the right mindset. It is not about technology, or at least, it&#39;s not about doing technology 532 &mdash; Paul Johnston - knows some stuff about stuff (@PaulDJohnston) December 13, 2018 While Serverless and FaaS are often used interchangeably, there are types of workloads that are more challenging to move to FaaS.</description> 533 </item> 534 535 <item> 536 <title>CORS</title> 537 <link>/reference/apigateway/cors/</link> 538 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 539 540 <guid>/reference/apigateway/cors/</guid> 541 <description>Cross Origin Resource Sharing defines a protocol by which resources on different domains may establish whether cross site operations are permissible. 542 Sparta makes CORS support a single CORSEnabled field of the API struct: 543 // Register the function with the API Gateway apiStage := sparta.NewStage(&#34;v1&#34;) apiGateway := sparta.NewAPIGateway(&#34;SpartaHTML&#34;, apiStage) // Enable CORS s.t. the S3 site can access the resources apiGateway.CORSEnabled = true Setting the boolean to true will add the necessary OPTIONS and mock responses to all resources exposed by your API.</description> 544 </item> 545 546 <item> 547 <title>Deployment Strategies</title> 548 <link>/reference/operations/deployment_strategies/</link> 549 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 550 551 <guid>/reference/operations/deployment_strategies/</guid> 552 <description> Document the SpartaSafeDeploy example. 553 </description> 554 </item> 555 556 <item> 557 <title>Details</title> 558 <link>/example_service/step2/</link> 559 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 560 561 <guid>/example_service/step2/</guid> 562 <description>The Overview walked through a simple &ldquo;Hello World&rdquo; example. In this section we&rsquo;ll cover how Sparta works in preparation for moving on to more advanced use. Most development will use the provision command line argument, so this section will outline exactly what that entails. 563 Provisioning Flow The provisioning workflow is defined in provision.go, with a goal of marshalling all AWS operations into a CloudFormation template. Where CloudFormation does not support a given service, Sparta falls back to using Lambda-backed Custom Resources in the template definition.</description> 564 </item> 565 566 <item> 567 <title>Slack SlashCommand</title> 568 <link>/reference/apigateway/slack/</link> 569 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 570 571 <guid>/reference/apigateway/slack/</guid> 572 <description>In this example, we&rsquo;ll walk through creating a Slack Slash Command service. The source for this is the SpartaSlackbot repo. 573 Our initial command handler won&rsquo;t be very sophisticated, but will show the steps necessary to provision and configure a Sparta AWS Gateway-enabled Lambda function. 574 Define the Lambda Function This lambda handler is a bit more complicated than the other examples, primarily because of the Slack Integration requirements. The full source is:</description> 575 </item> 576 577 <item> 578 <title>Metrics Publisher</title> 579 <link>/reference/operations/metrics_publisher/</link> 580 <pubDate>Sat, 01 Dec 2018 06:02:32 +0000</pubDate> 581 582 <guid>/reference/operations/metrics_publisher/</guid> 583 <description>AWS Lambda is tightly integrated with other AWS services and provides excellent opportunities for improving your service&rsquo;s observability posture. Sparta includes a CloudWatch Metrics publisher that periodically publishes metrics to CloudWatch. 584 This periodic task publishes environment-level metrics that have been detected by the gopsutil package. Metrics include: 585 CPU Percent used Disk Percent used Host Uptime (milliseconds) Load Load1 (no units) Load5 (no units) Load15 (no units) Network NetBytesSent (bytes) NetBytesRecv (bytes) NetErrin (count) NetErrout (count) You can provide an optional map[string]string set of dimensions to which the metrics should be published.</description> 586 </item> 587 588 <item> 589 <title>Profiling</title> 590 <link>/reference/operations/profiling/</link> 591 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 592 593 <guid>/reference/operations/profiling/</guid> 594 <description>One of Lambda&rsquo;s biggest strengths, its ability to automatically scale across ephemeral containers in response to increased load, also creates one of its biggest problems: observability. The traditional set of tools used to identify performance bottlenecks are no longer valid, as there is no host into which one can SSH and interactively interrogate. Identifying performance bottlenecks is even more significant due to the Lambda pricing model, where idle time often directly translates into increased costs.</description> 595 </item> 596 597 <item> 598 <title>CloudFormation Resources</title> 599 <link>/reference/application/custom_lambda_resources/</link> 600 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 601 602 <guid>/reference/application/custom_lambda_resources/</guid> 603 <description>In addition to per-lambda custom resources, a service may benefit from the ability to include a service-scoped Lambda backed CustomResource. 604 Including a custom service scoped resource is a multi-step process. The code excerpts below are from the SpartaCustomResource sample application. 605 1. Resource Type The first step is to define a custom CloudFormation Resource Type 606 //////////////////////////////////////////////////////////////////////////////// // 1 - Define the custom type const spartaHelloWorldResourceType = &#34;Custom::sparta::HelloWorldResource&#34; 2. Request Parameters The next step is to define the parameters that are supplied to the custom resource invocation.</description> 607 </item> 608 609 <item> 610 <title>Custom Resources</title> 611 <link>/reference/application/custom_resources/</link> 612 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 613 614 <guid>/reference/application/custom_resources/</guid> 615 <description>In some circumstances your service may need to provision or access resources that fall outside the standard workflow. In this case you can use CloudFormation Lambda-backed CustomResources to create or access resources during your CloudFormation stack&rsquo;s lifecycle. 616 Sparta provides unchecked access to the CloudFormation resource lifecycle via the RequireCustomResource function. This function registers an AWS Lambda Function as an CloudFormation custom resource lifecycle. 617 In this section we&rsquo;ll walk through a sample user-defined custom resource and discuss how a custom resource&rsquo;s outputs can be propagated to an application-level Sparta lambda function.</description> 618 </item> 619 620 <item> 621 <title>Discovery Service</title> 622 <link>/reference/discovery/</link> 623 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 624 625 <guid>/reference/discovery/</guid> 626 <description>The ability to provision dynamic infrastructure (see also the SES Event Source Example) as part of a Sparta application creates a need to discover those resources at lambda execution time. 627 Sparta exposes this functionality via sparta.Discover. This function returns information about the current stack (eg, name, region, ID) as well as metadata about the immediate dependencies of the calling go lambda function. 628 The following sections walk through provisioning a S3 bucket, declaring an explicit dependency on that resource, and then discovering the resource at lambda execution time.</description> 629 </item> 630 631 <item> 632 <title>Docker</title> 633 <link>/reference/docker/</link> 634 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 635 636 <guid>/reference/docker/</guid> 637 <description>TODO 638 Docker Support Document the SpartaDocker project.</description> 639 </item> 640 641 <item> 642 <title>Hybrid Topologies</title> 643 <link>/reference/hybrid_topologies/</link> 644 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 645 646 <guid>/reference/hybrid_topologies/</guid> 647 <description>At a broad level, AWS Lambda represents a new level of compute abstraction for services. Developers don&rsquo;t immediately concern themselves with HA topologies, configuration management, capacity planning, or many of the other areas traditionally handled by operations. These are handled by the vendor supplied execution environment. 648 However, Lambda is a relatively new technology and is not ideally suited to certain types of tasks. For example, given the current Lambda limits, the following task types might better be handled by &ldquo;legacy&rdquo; AWS services:</description> 649 </item> 650 651 <item> 652 <title>S3 Sites with CORS</title> 653 <link>/reference/apigateway/s3site/</link> 654 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 655 656 <guid>/reference/apigateway/s3site/</guid> 657 <description>Sparta supports provisioning an S3-backed static website as part of provisioning. We&rsquo;ll walk through provisioning a minimal Bootstrap website that accesses API Gateway lambda functions provisioned by a single service in this example. 658 The source for this is the SpartaHTML example application. 659 Lambda Definition We&rsquo;ll start by creating a very simple lambda function: 660 import ( spartaAPIGateway &#34;github.com/mweagle/Sparta/aws/apigateway&#34; spartaAWSEvents &#34;github.com/mweagle/Sparta/aws/events&#34; ) type helloWorldResponse struct { Message string Request spartaAWSEvents.APIGatewayRequest } //////////////////////////////////////////////////////////////////////////////// // Hello world event handler func helloWorld(ctx context.</description> 661 </item> 662 663 <item> 664 <title>Dynamic Infrastructure</title> 665 <link>/reference/decorators/dynamic_infrastructure/</link> 666 <pubDate>Sat, 01 Dec 2018 06:28:42 +0000</pubDate> 667 668 <guid>/reference/decorators/dynamic_infrastructure/</guid> 669 <description>In addition to provisioning AWS Lambda functions, Sparta supports the creation of other CloudFormation Resources. This enables a service to move towards immutable infrastructure, where the service and its infrastructure requirements are treated as a logical unit. 670 For instance, consider the case where two developers are working in the same AWS account. 671 Developer 1 is working on analyzing text documents. Their lambda code is triggered in response to uploading sample text documents to S3.</description> 672 </item> 673 674 <item> 675 <title>Testing</title> 676 <link>/reference/testing/</link> 677 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 678 679 <guid>/reference/testing/</guid> 680 <description>While developing Sparta lambda functions it may be useful to test them locally without needing to provision each new code change. You can test your lambda functions using standard go test functionality. 681 To create proper event types, consider: 682 AWS Lambda Go types Sparta types Use NewAPIGatewayMockRequest to generate API Gateway style requests. </description> 683 </item> 684 685 <item> 686 <title>Supporting Packages</title> 687 <link>/reference/supporting_packages/</link> 688 <pubDate>Mon, 22 Jan 2018 21:49:38 +0000</pubDate> 689 690 <guid>/reference/supporting_packages/</guid> 691 <description>The following packages are part of the Sparta ecosystem and can be used in combination or as standalone in other applications. 692 go-cloudcondensor The go-cloudcondensor package provides utilities to express CloudFormation templates as a set of go functions. Templates are evaluated and the and the resulting JSON can be integrated into existing CLI-based workflows. 693 go-cloudformation The go-cloudformation package provides a Go object model for the official CloudFormation JSON Schema. 694 SpartaVault SpartaVault uses KMS to encrypt values into Go types that can be safely committed to source control.</description> 695 </item> 696 697 <item> 698 <title>Limitations</title> 699 <link>/reference/limitations/</link> 700 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 701 702 <guid>/reference/limitations/</guid> 703 <description>AWS Lambda Limitations Lambda is not yet globally available. Please view the Global Infrastructure page for the latest deployment status. There are Lambda Limits that may affect your development It&rsquo;s not possible to dynamically set HTTP response headers based on the Lambda response body: https://forums.aws.amazon.com/thread.jspa?threadID=203889 https://forums.aws.amazon.com/thread.jspa?threadID=210826 Similarly, it&rsquo;s not possible to set proper error response bodies. </description> 704 </item> 705 706 <item> 707 <title>FAQ</title> 708 <link>/reference/faq/</link> 709 <pubDate>Wed, 09 Mar 2016 19:56:50 +0100</pubDate> 710 711 <guid>/reference/faq/</guid> 712 <description>CloudFormation How do I create dynamic resource ARNs? Linking AWS resources together often requires creating dynamic ARN references. This can be achieved by using cloudformation.Join expressions. 713 For instance: 714 import ( gocf &#34;github.com/mweagle/go-cloudformation&#34; ) s3SiteBucketAllKeysResourceValue := gocf.Join(&#34;&#34;, gocf.String(&#34;arn:aws:s3:::&#34;), gocf.Ref(s3BucketResourceName), gocf.String(&#34;/*&#34;)) import ( gocf &#34;github.com/mweagle/go-cloudformation&#34; ) AuthorizerURI: gocf.Join(&#34;&#34;, gocf.String(&#34;arn:aws:apigateway:&#34;), gocf.Ref(&#34;AWS::Region&#34;).String(), gocf.String(&#34;:lambda:path/2015-03-31/functions/&#34;), gocf.GetAtt(myAWSLambdaInfo.LogicalResourceName(), &#34;Arn&#34;), gocf.String(&#34;/invocations&#34;)), See the CloudFormation Fn::GetAtt docs for the set of attributes created by each resource. CloudFormation pseudo-parameters can be included in dynamic expresssions via gocf.</description> 715 </item> 716 717 <item> 718 <title></title> 719 <link>/_footer/</link> 720 <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate> 721 722 <guid>/_footer/</guid> 723 <description></description> 724 </item> 725 726 <item> 727 <title></title> 728 <link>/_header/</link> 729 <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate> 730 731 <guid>/_header/</guid> 732 <description></description> 733 </item> 734 735 </channel> 736 </rss>