AWS SAM Global Tags

I recently completed work on an AWS Serverless Application Model (SAM) application that runs in Lambda and stores data in DynamoDB. I also wanted to tag resources created by SAM with metadata required by the application. Fortunately, SAM provides a Global block that includes a parameter for Tags. Tag information is supplied using a map of strings.

Below is an example of using global tags in a SAM template:

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: "Gets data from the xxxxx API."

Globals:
  Function:
    Timeout: 3
    Tags:
      InterestingTag1: "Interesting Answer 1"
      InterestingTag2: "Interesting Answer 2"
      InterestingTag3: "Interesting Answer 3"
      InterestingTag4: "Interesting Answer 4"

In most situations, using a global tag parameter results in supplying tag metadata to all resources deployed by SAM. However, I noticed that the deployment process was not tagging the DynamoDB table, although the deployment process encountered no errors.

I’m guessing this behavior is caused by DynamoDB requiring a list of key-value pairs. Providing tags directly to the resource works.

  MyTable:
    Type: AWS::DynamoDB::Table
    Description: "Stores the data."
    Properties:
      <---snip--->
      Tags:
        - Value: "Interesting Tag 1"
          Key: "InterestingTag1"
        - Value: "Interesting Tag 2"
          Key: "InterestingTag2"
        - Value: "Interesting Tag 3"
          Key: "InterestingTag3"          
        - Value: "Interesting Tag 4"
          Key: "InterestingTag4"

I suppose this is just a quirk to using SAM as an abstraction layer and one that I’d probably forget if it wasn’t documented here.