Why does AWS SAM CLI (awssamcli) fail to build when using Global section?

Question:

I just found out about the Global section which seems very useful in cleaning up the template.yaml for AWS SAM cloud formation templating. After completing the Global section I remove the Runtime from my lambda (since it should inherit Runtime from the Global section now). But once I do that I get an error.

Here is my template.yaml:

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Global:
  Function:
    Handler: app.lambda_handler
    Runtime: python3.8
    Timeout: 900
    MemorySize: 10240
    VpcConfig:
      SecurityGroupIds:
        - !Ref SecurityGroupABC
      SubnetIds:
        - subnet-abc
        - subnet-xyz
        - subnet-rrr   
    Environment:
      Variables:
        ENV_VAR: abc123  
Resources:
   lambdaName:
    Type: AWS::Serverless::Function 
    Role: 'arn:aws:iam::1234...'
    #Runtime: python3.8
    Properties:
      CodeUri: lambda/lambdaName/

And this is the error I’m seeing after running sam build:

  File "runpy.py", line 194, in _run_module_as_main
  File "runpy.py", line 87, in _run_code
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamcli__main__.py", line 12, in <module>
    cli(prog_name="sam")
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickcore.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickcore.py", line 782, in main
    rv = self.invoke(ctx)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickcore.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickcore.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickcore.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickdecorators.py", line 73, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagesclickcore.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibtelemetrymetric.py", line 153, in wrapped
    raise exception  # pylint: disable=raising-bad-type
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibtelemetrymetric.py", line 122, in wrapped
    return_value = func(*args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibutilsversion_checker.py", line 42, in wrapped
    actual_result = func(*args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamcliclimain.py", line 90, in wrapper
    return func(*args, **kwargs)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclicommandsbuildcommand.py", line 210, in cli
    do_cli(
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclicommandsbuildcommand.py", line 315, in do_cli
    artifacts = builder.build()
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibbuildapp_builder.py", line 139, in build
    build_graph = self._get_build_graph(self._container_env_var, self._container_env_var_file)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibbuildapp_builder.py", line 206, in _get_build_graph
    build_graph.clean_redundant_definitions_and_update(not self._is_building_specific_resource)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibbuildbuild_graph.py", line 256, in clean_redundant_definitions_and_update
    self._write()
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibbuildbuild_graph.py", line 296, in _write
    build_definition_as_table = _function_build_definition_to_toml_table(function_build_definition)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagessamclilibbuildbuild_graph.py", line 53, in _function_build_definition_to_toml_table
    toml_table[RUNTIME_FIELD] = function_build_definition.runtime
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagestomlkititems.py", line 1022, in __setitem__
    value = item(value)
  File "C:Program FilesAmazonAWSSAMCLIruntimelibsite-packagestomlkititems.py", line 107, in item
    raise ValueError("Invalid type {}".format(type(value)))
ValueError: Invalid type <class 'NoneType'>

If I leave the lambda’s Runtime in the its section I don’t get the error. But leaving that in would defeat the purpose of establishing those global values to reduce redundancy.

Asked By: Liam Hanninen

||

Answers:

In your template, Global should be renamed as Globals

Please refer to the Globals Section link that you already shared.

Answered By: dossani

Use sam validate -t yourtemplate.yaml to check for syntax errors. This error came up for me because of a missing parameter in my lambda function. Not very helpful exception but the validate tool exposed my problems.

Answered By: Tristan Perotti