понедельник, 13 января 2020 г.

aws cloudformation syntax

Несколько слов про синтаксис. cfn умеет yaml и json, и отличия там не такие и большие. Я бы сказал так: json больше подходит тем кто программировал(ует) на С(++) и/или пишет json руками, а для большинства удобнее будет yaml. Но это моё имхо. Или так: одним больше нравится считать пачки скобочек, другим - пробелы. Но без вменяемого IDE можно в обоих вариантах долго искать проблему.



Пример кода отсюда

JSON

{ "Type" : "AWS::CloudFormation::Stack", "Properties" : { "NotificationARNs" : [ String, ... ], "Parameters" : {Key : Value, ...}, "Tags" : [ Tag, ... ], "TemplateURL" : String, "TimeoutInMinutes" : Integer } }

YAML

Type: AWS::CloudFormation::Stack Properties: NotificationARNs: - String Parameters: Key : Value Tags: - Tag TemplateURL: String TimeoutInMinutes: Integer
https://docs.aws.amazon.com/en_us/AWSCloudFormation/latest/UserGuide/template-formats.html
А теперь о тех ключевых отличиях что я знаю:
1) В yaml есть комментарии. В json их, соответственно, нету.
2) Несколько удобнее сокращённая форма записи (правда надо её освоить), когда вместо Fn::Ref можно писать !Ref и читаемость улучшается
3) В yaml есть весьма элегантное написание
       UserData:
          Fn::Base64: !Sub |
            line 1
            line 2
            AWS::StackName
Читается легко, сразу понятно что описано. Но в json напрямую это не преобразовать, это будет или уродливое    "UserData": {"Fn::Base64": {"Fn::Sub": "line1\nline2\nAWS::StackName"}} или надо переписывать через Fn::Join, что читается сильно лучше чем line1\nline2, но всё-равно сильно хуже чем ямл версия. Тем более, уже не получится копипастить куски кода без обработки.
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
             "line1\n",
             "line2\n",
             { "Ref" : "AWS::StackName" }
]]}}
Тот же Ref теперь надо каждый раз прописывать.

Также бывает такое
--resources-to-import does not support inline YAML.
https://docs.aws.amazon.com/en_us/AWSCloudFormation/latest/UserGuide/resource-import-nested-stacks.html

Также, именно ImportValue не может использовать в yaml с Sub:
You can't use the short form of !ImportValue when it contains a !Sub. The following example is valid for AWS CloudFormation, but not valid for YAML
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

Комментариев нет:

Отправить комментарий