Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 强制AWS帐号以“开始”;00“;串_Amazon Web Services_Amazon Cloudformation - Fatal编程技术网

Amazon web services 强制AWS帐号以“开始”;00“;串

Amazon web services 强制AWS帐号以“开始”;00“;串,amazon-web-services,amazon-cloudformation,Amazon Web Services,Amazon Cloudformation,有人知道如何将以“00”开头的帐号转换成字符串吗?我正在使用CFn模板中的映射根据帐号分配值。我将帐号放在引号中,以便将其转换为字符串,如果它不是以零开头,则工作正常,如果它以零开头,则会出现以下错误: [/Mappings/EnvMap]映射键必须是字符串;收到的数字[1.50xxx028E9] 映射: 环境地图: “8727XX0”: 环境:“开发” “707xx78”: 环境:“测试” “00150xxx280”: 环境:“产品” 资源: rS3Stack: 类型:“AWS::CloudF

有人知道如何将以“00”开头的帐号转换成字符串吗?我正在使用CFn模板中的映射根据帐号分配值。我将帐号放在引号中,以便将其转换为字符串,如果它不是以零开头,则工作正常,如果它以零开头,则会出现以下错误:

[/Mappings/EnvMap]映射键必须是字符串;收到的数字[1.50xxx028E9]

映射:
环境地图:
“8727XX0”:
环境:“开发”
“707xx78”:
环境:“测试”
“00150xxx280”:
环境:“产品”
资源:
rS3Stack:
类型:“AWS::CloudFormation::Stack”
特性:
模板URL:“https://s3.amazonaws.com/some_bucket/nested_cfn/s3.yaml"
参数:
环境:!FindInMap
-环境地图
- !参考'AWS::AccountId'
-环境

您的问题是由YAML 1.1规范中的一些模糊性导致的。根据YAML 1.1,整数不得以
0
开头,数字不得以
0
开头,并被视为八进制数。因此,当PyYAML解析帐户id时,它认为帐户id不是整数,因为它以
0
开头,但也不是八进制数,因为它包含
8
。由于它既不是整数,也不是八进制数,PyYAML认为它是一个字符串,在没有引号的情况下可以安全地转储它

重现这种情况的一个简单示例如下所示:

导入系统 >>>进口yaml >>>yaml.dump([“1”、“8”、“01”、“08”],系统标准输出) - '1' - '8' - '01' - 08 现在,您可能想知道为什么这里提到了PyYAML bug,而您只想部署一个CloudFormation堆栈:

根据部署CloudFormation堆栈的方式,模板可能会在部署之前在本地进行转换。例如,当使用
aws cloudformation package
sam package
sam build
以S3中的路径替换本地代码位置时,就会发生这种情况。由于在这些转换期间读取和写入模板是使用PyYAML完成的,因此会触发上面提到的PyYAML错误。有与此问题相关的和的错误报告

由于导致问题的帐户id在您的案例中被用作密钥,因此您解决该问题的选项是有限的,因为您无法利用CloudFormation的内在功能。但是,仍有可能的解决办法:

如果您使用的是AWS CLI,则可以切换到使用AWS CLI v2,因为它使用
ruamel
而不是
PyYAML
,因此不会出现此错误
ruamel
实现了YAML 1.2,它的规范中没有含糊不清的地方,因此可以像人们期望的那样处理数字

无论您使用的是AWS SAM CLI还是AWS CLI,您都可以使用的是将转换后的模板从YAML转换为JSON并返回到YAML,这也“修复”了该缺陷,因为它会导致再次引用有问题的数字。有一个从AWS调用的工具来执行此操作。您必须在打包和部署之间运行此双重翻转。例如,对于AWS SAM CLI,如下所示:

sam build
cfn-flip .aws-sam/build/template.yaml | cfn-flip > .aws-sam/build/template.tmp.yaml
mv .aws-sam/build/template.tmp.yaml .aws-sam/build/template.yaml
sam deploy

说到这里,我个人会建议一种完全不同的解决方法,那就是从模板中删除映射。硬编码帐户ID和环境会降低模板的可移植性,因为它限制了此模板可用于的帐户/环境。相反,我将环境作为CloudFormation模板的一个参数提供,因此它根本不需要知道帐户ID。

您的问题是由YAML 1.1规范中的一些模糊性导致的。根据YAML 1.1,整数不得以
0
开头,数字不得以
0
开头,并被视为八进制数。因此,当PyYAML解析帐户id时,它认为帐户id不是整数,因为它以
0
开头,但也不是八进制数,因为它包含
8
。由于它既不是整数,也不是八进制数,PyYAML认为它是一个字符串,在没有引号的情况下可以安全地转储它

重现这种情况的一个简单示例如下所示:

导入系统 >>>进口yaml >>>yaml.dump([“1”、“8”、“01”、“08”],系统标准输出) - '1' - '8' - '01' - 08 现在,您可能想知道为什么这里提到了PyYAML bug,而您只想部署一个CloudFormation堆栈:

根据部署CloudFormation堆栈的方式,模板可能会在部署之前在本地进行转换。例如,当使用
aws cloudformation package
sam package
sam build
以S3中的路径替换本地代码位置时,就会发生这种情况。由于在这些转换期间读取和写入模板是使用PyYAML完成的,因此会触发上面提到的PyYAML错误。有与此问题相关的和的错误报告

由于导致问题的帐户id在您的案例中被用作密钥,因此您解决该问题的选项是有限的,因为您无法利用CloudFormation的内在功能。但是,仍有可能的解决办法:

如果您使用的是AWS CLI,则可以切换到使用AWS CLI v2,因为它使用
ruamel
而不是
PyYAML
,因此不会出现此错误
ruamel
实现了YAML 1.2,它的规范中没有含糊不清的地方,因此可以像人们期望的那样处理数字

无论您使用的是AWS SAM CLI还是AWS CLI,您都可以使用的是将转换后的模板从YAML转换为JSON并返回到YAML,这也“修复”了该缺陷,因为它会导致再次引用有问题的数字。有一个从AWS调用的工具来执行此操作。您必须在打包和部署之间运行此双重翻转。例如,对于AWS SAM CLI,如下所示: