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'))
问题是输出文件保留了 BillingMode
和 Outputs
之间的新行
这里是输出文件(只有受影响的部分)
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
不用于输出并且不必更改。您可以更通用地搜索映射中的最后一个键,弹出其注释,然后将其分配给新插入的键(如果新键已经在映射中,您不想这样做)。
我有以下 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'))
问题是输出文件保留了 BillingMode
和 Outputs
这里是输出文件(只有受影响的部分)
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
不用于输出并且不必更改。您可以更通用地搜索映射中的最后一个键,弹出其注释,然后将其分配给新插入的键(如果新键已经在映射中,您不想这样做)。