YAML - 在 comments/New 行之前附加内容

YAML - Appending Content before comments/New lines

我有以下 YAML 文件

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
    sam-app

    Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
    Function:
        Timeout: 20
        MemorySize: 512
        Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object
          Variables:
            TABLE_NAME: !Ref OrdersTable
            ENDPOINT_OVERRIDE: ""

Resources:
  GetOrderFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: target/aws-sam-java-rest-1.0.0.jar
      Handler: com.amazonaws.handler.GetOrderHandler::handleRequest
      Runtime: java8
      Policies:
        - DynamoDBReadPolicy:
            TableName: !Ref OrdersTable
      Events:
        GetOrder:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /orders/{order_id}
            Method: get
  OrdersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: orders_table
      AttributeDefinitions:
        - AttributeName: orderId
          AttributeType: S
      KeySchema:
        - AttributeName: orderId
          KeyType: HASH
      BillingMode: PAY_PER_REQUEST


Outputs:
    HelloWorldApi:
      Description: "API Gateway endpoint URL for Prod stage for Hello World function"
      Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"

    GetOrderFunction:
      Description: "GetOrder Lambda Function ARN"
      Value: !GetAtt GetOrderFunction.Arn

    GetOrdersFunction:
      Description: "GetOrders Lambda Function ARN"
      Value: !GetAtt GetOrdersFunction.Arn

    UpdateOrderFunction:
      Description: "UpdateOrder Lambda Function ARN"
      Value: !GetAtt UpdateOrderFunction.Arn

    DeleteOrderFunction:
      Description: "DeleteOrder Lambda Function ARN"
      Value: !GetAtt DeleteOrderFunction.Arn

    CreateOrderFunction:
      Description: "CreateOrder Lambda Function ARN"
      Value: !GetAtt CreateOrderFunction.Arn

我正在尝试通过以下方式将另一个 属性 添加到 Resources:OrdersTable:Properties

main.py

from ruamel.yaml import YAML
yaml = YAML()
with open('template.yaml', 'r') as f:
    dataMap = yaml.load(f)
    dataMap['Resources']['OrdersTable']['Properties']['Tags'] = [
        {
            'Key': 'Name1',
            'Value': 'Value1'
        },
        {
            'Key': 'Name2',
            'Value': 'Value2'
        },
        {
            'Key': 'Name3',
            'Value': 'Value3'
        }]
        yaml.dump(dataMap, open('new.yaml', 'w'))

问题是输出文件保留了 BillingModeOutputs

之间的新行

这里是输出文件(只有受影响的部分)

new.yaml

Resources:
  OrdersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: orders_table
      AttributeDefinitions:
      - AttributeName: orderId
        AttributeType: S
      KeySchema:
      - AttributeName: orderId
        KeyType: HASH
      BillingMode: PAY_PER_REQUEST


      Tags:
      - Key: Name1
        Value: Value1
      - Key: Name2
        Value: Value2
      - Key: Name3
        Value: Value3
Outputs:
  HelloWorldApi:
    Description: API Gateway endpoint URL for Prod stage for Hello World function
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"

这就是我希望新文件的样子

Resources:
  OrdersTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: orders_table
      AttributeDefinitions:
      - AttributeName: orderId
        AttributeType: S
      KeySchema:
      - AttributeName: orderId
        KeyType: HASH
      BillingMode: PAY_PER_REQUEST
      Tags:
      - Key: Name1
        Value: Value1
      - Key: Name2
        Value: Value2
      - Key: Name3
        Value: Value3


Outputs:
  HelloWorldApi:
    Description: API Gateway endpoint URL for Prod stage for Hello World function
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"

我发现 BillingMode 地图看起来像这样 {'BillingMode': [None, None, CommentToken('\n\n\n', line: 104, col: 19), None]},但我不知道如何利用这些知识。 任何帮助将不胜感激。

ruamel.yaml 中的评论(和空行被视为评论)当前 (0.17) 与它之前的节点相关联。在这种情况下,映射中出现的映射注释与键关联。

因此您需要做的是将评论与新密钥重新关联。正在做

 mapvar =  dataMap['Resources']['OrdersTable']['Properties']
 mapvar.ca.items['Tags'] = mapvar.ca.items.pop('BillingMode')

应该可以解决问题。 line: 104 不用于输出并且不必更改。您可以更通用地搜索映射中的最后一个键,弹出其注释,然后将其分配给新插入的键(如果新键已经在映射中,您不想这样做)。