如何在 cloudformation 模板中指定 lambda 函数和 IAM 角色名称

How to specify lambda function and IAM role name in cloudformation template

这是我的模板

{  
   "AWSTemplateFormatVersion":"2010-09-09",
   "Resources":{  
      "lambdafunction":{  
         "Type":"AWS::Lambda::Function",
         "Properties":{  
            "Handler":"index.handler",
            "Role":{  
               "Fn::GetAtt":[  
                  "RootRole",
                  "Arn"
               ]
            },
            "Code":{  
               "S3Bucket":"{s3_bucket_name}",
               "S3Key":"lambda-zip"
            },
            "Runtime":"java8",
            "Timeout":"25"
         }
      },
      "RootRole":{  
         "Type":"AWS::IAM::Role",
         "Properties":{  
            "AssumeRolePolicyDocument":{  
               "Version":"2012-10-17",
               "Statement":[  
                  {  
                     "Effect":"Allow",
                     "Principal":{  
                        "Service":[  
                           "ec2.amazonaws.com"
                        ]
                     },
                     "Action":[  
                        "sts:AssumeRole"
                     ]
                  }
               ]
            },
            "Path":"/",
            "Policies":[  
               {  
                  "PolicyName":"root",
                  "PolicyDocument":{  
                     "Version":"2012-10-17",
                     "Statement":[  
                        {  
                           "Effect":"Allow",
                           "Action":"*",
                           "Resource":"*"
                        }
                     ]
                  }
               }
            ]
         }
      }
   }
}

创建堆栈后的lambda函数名称为 lambda-lambdafunction-18SJKJ5Q40AKZ IAM 角色的名称是 lambda-RootRole-12S8E9CA0EOVM

模板似乎没有办法定义 lambda 函数名称http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html。而且我不确定为什么最后会附加随机字符。

更新:AWS::IAM::Role 和 AWS::Lambda::Function 现在都支持自定义名称。

默认情况下,CloudFormation 会为资源名称生成一个唯一 ID。这是有道理的,因为它允许您一次又一次地重新使用模板。

一些资源类型(但不是全部)支持自定义名称。支持自定义名称的示例有 AWS::DynamoDB::Table ('TableName') 和 AWS::S3::Bucket ('BucketName').

有关详细信息和支持自定义名称的完整资源列表,请参阅 here

实际上,我发现 "FunctionName" 允许您命名 Lambda 函数:

 "LambdaResourceName": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "FunctionName": "",
        "Description": "",
        "Handler": "app.handler",
        "Role": 
        "Code": 
    "Runtime": "node.js"

在 Role 的属性中使用 "RoleName" 并在 Lambda 的属性中使用 "FunctionName" 为正在创建的 Lambda 函数和角色指定特定名称。