Я делаю лямбда-функцию через шаблон CloudFormation, и я хотел бы сделать необязательным ввод информации для свойства VpcConfig.Я нашел статьи, подобные этой, о том, как сделать параметры необязательными:
https://cloudonaut.io/optional-parameter-in-cloudformation/
Это было очень полезно для поиска синтаксиса, чтобы сделать свойства с одиночными значениями необязательными (например, одно строковое значение).
Но мне нужно выяснить, как сделать весь VpcConfig OBJECT необязательным.
Это немного сложно, потому что объект VpcConfig имеет два свойства: SecurityGroupIds и SubnetIds.И оба требуются.Таким образом, пользователь должен ввести оба из тех или ни одного из них.Если ни один из них не введен, то весь объект VpcConfig должен быть пустым или не существовать (что должно быть в порядке, поскольку сам объект VpConfig является необязательным).
Вот сокращенная версия того, что у меня есть сейчас, но этоэтого недостаточно, так как я все еще получаю сообщения о том, что SecurityGroupIds и SubnetIds не могут иметь пустых значений, поскольку они требуются, пока объект присутствует в свойстве VpcConfig:
"Conditions": {
"HasSecurityGroups": {"Fn::Not": [{"Fn::Equals": [{"Fn::Join": ["", {"Ref": "SecurityGroupIds"}]}, ""]}]},
"HasSubnetIds": {"Fn::Not": [{"Fn::Equals": [{"Fn::Join": ["", {"Ref": "SubnetIds"}]}, ""]}]}
},
и затем в лямбда-выраженииресурс:
"VpcConfig" : {
"SecurityGroupIds" : {"Fn::If": ["HasSecurityGroups", {"Ref": "SecurityGroupIds"}, {"Ref": "AWS::NoValue"}]},
"SubnetIds" : {"Fn::If": ["HasSubnetIds", {"Ref": "SubnetIds"}, {"Ref": "AWS::NoValue"}]}
},
Вот весь шаблон, если это полезно:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "Lambda template for testing purposes",
"Parameters" : {
"S3BucketName" : {
"Type" : "String",
"Description" : "The name of the Amazon S3 bucket where the .zip file that contains your deployment package is stored."
},
"S3FileLocation" : {
"Type" : "String",
"Description" : "The location and name of the .zip file that contains your source code."
},
"S3ObjectVersion" : {
"Type" : "String",
"Description" : "If you have S3 versioning enabled, the version ID of the zip file that contains your source code."
},
"DeadLetterArn" : {
"Type" : "String",
"Description" : "ARN that specifies a Dead Letter Queue (DLQ) that Lambda sends events to when it can't process them. For example, you can send unprocessed events to an Amazon Simple Notification Service (Amazon SNS) topic, where you can take further action."
},
"EnvironmentVariable" : {
"Type" : "String",
"Default" : "test",
"Description" : "Environment Variable"
},
"KmsKeyArn" : {
"Type" : "String",
"Description" : "KMS Key ARN if environment variables are encrypted"
},
"HandlerFunctionName" : {
"Type" : "String",
"Description" : "Name of function to initiate the Lambda"
},
"MemorySize" : {
"Type" : "Number",
"Description" : "Number of MB to allocate to the Lambda function",
"ConstraintDescription" : "Multiples of 64, between 128 and 3008",
"MinValue" : "128",
"Default" : "128"
},
"SecurityGroupIds" : {
"Type" : "CommaDelimitedList",
"Description" : "A list of one or more security groups IDs in the VPC that includes the resources to which your Lambda function requires access."
},
"SubnetIds" : {
"Type" : "CommaDelimitedList",
"Description" : "A list of one or more subnet IDs in the VPC that includes the resources to which your Lambda function requires access."
},
"Role" : {
"Type" : "String",
"Description" : "ARN of Lambda Role"
},
"FuncName" : {
"Type" : "String",
"Description" : "Name of the the new Lambda function?"
}
},
"Conditions": {
"HasSecurityGroups": {"Fn::Not": [{"Fn::Equals": [{"Fn::Join": ["", {"Ref": "SecurityGroupIds"}]}, ""]}]},
"HasSubnetIds": {"Fn::Not": [{"Fn::Equals": [{"Fn::Join": ["", {"Ref": "SubnetIds"}]}, ""]}]}
},
"Resources" : {
"LambdaFunction" : {
"Type" : "AWS::Lambda::Function",
"Properties" : {
"Code" : {
"S3Bucket" : { "Ref" : "S3BucketName" },
"S3Key" : { "Ref" : "S3FileLocation" },
"S3ObjectVersion" : { "Ref" : "S3ObjectVersion" }
},
"DeadLetterConfig" : {
"TargetArn" : { "Ref" : "DeadLetterArn" }
},
"Description" : "Lambda",
"Environment" : {
"Variables" : {
"SomeVariable": {
"Ref" : "EnvironmentVariable"
}
}
},
"FunctionName" : { "Ref" : "FuncName" },
"Handler" : { "Ref" : "HandlerFunctionName" },
"KmsKeyArn" : { "Ref" : "KmsKeyArn" },
"MemorySize" : { "Ref" : "MemorySize" },
"Role" : { "Ref" : "Role" },
"Runtime" : "python3.6",
"VpcConfig" : {
"SecurityGroupIds" : {"Fn::If": ["HasSecurityGroups", {"Ref": "SecurityGroupIds"}, {"Ref": "AWS::NoValue"}]},
"SubnetIds" : {"Fn::If": ["HasSubnetIds", {"Ref": "SubnetIds"}, {"Ref": "AWS::NoValue"}]}
},
"Tags" : [ {
"Key" : "test",
"Value" : "true"
} ]
}
}
},
"Outputs" : {
"LambdaFunction" : {
"Description" : "Lambda function",
"Value" : { "Ref" : "LambdaFunction" },
"Export" : {
"Name" : {"Fn::Sub": "${AWS::StackName}-Lambda" }
}
}
}
}
Обновление : ответ, опубликованный ниже цементными блоками, работает для консоли AWS GUI,но, к сожалению, проблема все еще остается той же, если вы пытаетесь развернуть шаблон с помощью интерфейса командной строки.Я создал новый вопрос по ссылке ниже, чтобы решить эту проблему отдельно, так как я думаю, что его ответ поможет большинству людей, которые ссылаются на этот пост.
Необязательные параметры при использовании AWS CLI длязапустить шаблон CloudFormation