3.3.4 Implement and Deploy IaC Templates

Implement and Deploy IaC Templates

AWS SAM Template Anatomy

AWS SAM template file closely follows CloudFormation template format với primary differences:

  1. Transform declaration - Transform: AWS::Serverless-2016-10-31 (required)
  2. Globals section - Unique to SAM, defines common properties
  3. Resources section - Combination of CloudFormation + SAM resources

Template Sections

Transform (Required)

Transform: AWS::Serverless-2016-10-31

Hoặc với language extensions:

Transform:
  - AWS::LanguageExtensions
  - AWS::Serverless-2016-10-31

Lưu ý: AWS::LanguageExtensions phải đặt trước serverless transform.

Globals (Optional - SAM only)

Properties common to all serverless functions, APIs, tables. Các resources inherit properties từ Globals:

  • AWS::Serverless::Function
  • AWS::Serverless::Api
  • AWS::Serverless::HttpApi
  • AWS::Serverless::SimpleTable
  • AWS::Serverless::StateMachine
  • AWS::Serverless::CapacityProvider
Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    Environment:
      Variables:
        LOG_LEVEL: INFO
  Api:
    Cors:
      AllowOrigin: "'*'"
      AllowHeaders: "'*'"

Resources (Required)

Stack resources - combination of:

  • CloudFormation resources
  • AWS SAM resources
Resources:
  MyFunction:
    Type: AWS::Serverless::Function  # SAM resource
    Properties:
      Handler: app.handler
      Runtime: python3.12
      
  MyTable:
    Type: AWS::DynamoDB::Table  # CloudFormation resource
    Properties:
      TableName: orders

Other Sections (Optional)

SectionPurpose
DescriptionText describing template
MetadataAdditional template information
ParametersRuntime values (prompts in sam deploy --guided)
MappingsKey-value lookup table
ConditionsControl resource creation
OutputsValues returned when viewing stack

Complete SAM Template Example

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    Tracing: Active

Description: Order processing application

Metadata:
  AWS::ServerlessRepo::Application:
    Name: order-app
    Description: Process orders

Parameters:
  Stage:
    Type: String
    AllowedValues: [dev, staging, prod]
    Default: dev

Mappings:
  StageConfig:
    dev:
      MemorySize: 128
    prod:
      MemorySize: 512

Conditions:
  IsProd: !Equals [!Ref Stage, prod]

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: app.handler
      CodeUri: src/
      MemorySize: !FindInMap [StageConfig, !Ref Stage, MemorySize]
      Environment:
        Variables:
          TABLE_NAME: !Ref MyTable
          STAGE: !Ref Stage
      Events:
        Api:
          Type: Api
          Properties:
            Path: /orders
            Method: get

  MyTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: !Sub "orders-${Stage}"
      BillingMode: PAY_PER_REQUEST
      AttributeDefinitions:
        - AttributeName: id
          AttributeType: S
      KeySchema:
        - AttributeName: id
          KeyType: HASH

Outputs:
  ApiUrl:
    Description: API Gateway endpoint URL
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/orders"
  FunctionArn:
    Description: Lambda Function ARN
    Value: !GetAtt MyFunction.Arn

CloudFormation Intrinsic Functions

FunctionUseExample
!RefReference parameter/resource!Ref MyTable
!SubString substitution!Sub "orders-${Stage}"
!GetAttResource attribute!GetAtt MyFunction.Arn
!IfConditional value!If [IsProd, 512, 128]
!ImportValueCross-stack reference!ImportValue VpcId
!FindInMapLookup in Mappings!FindInMap [StageConfig, dev, MemorySize]
!JoinJoin strings!Join ['-', [orders, !Ref Stage]]

Parameter Overrides Priority

  1. sam deploy --parameter-overrides (highest)
  2. Configuration file (samconfig.toml)
  3. Template Parameters section (lowest)

Deploy Commands

# Build
sam build

# Deploy with prompts (first time)
sam deploy --guided

# Deploy with parameters
sam deploy --parameter-overrides Stage=prod

# Deploy from config
sam deploy --config-file samconfig.toml

Template Section Order

Recommended logical order:

  1. Transform (required)
  2. Globals (optional)
  3. Description (optional)
  4. Metadata (optional)
  5. Parameters (optional)
  6. Mappings (optional)
  7. Conditions (optional)
  8. Resources (required)
  9. Outputs (optional)

Exam Tip:

  • Transform = AWS::Serverless-2016-10-31 (required)
  • Globals = unique to SAM, inherited by serverless resources
  • Resources = only required section
  • Parameters = cause prompts in sam deploy --guided
  • !Ref for IDs, !GetAtt for attributes, !Sub for string interpolation
  • Parameter overrides: CLI > config file > template