YAML-在评论/新行之前附加内容



我有以下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之间的新行

这是输出文件(仅受影响的部分(

新.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('nnn', 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不用于输出,也不必更改。你可以更通用地搜索映射中的最后一个键,弹出它的注释,然后将其分配给新插入的键(如果新键已经在映射中,你不想这样做(。

最新更新