如何从 cloudformation 模板中的参数文件传递公钥?
Posted
技术标签:
【中文标题】如何从 cloudformation 模板中的参数文件传递公钥?【英文标题】:How to pass public key from parameter file in cloudformation template? 【发布时间】:2021-05-28 16:11:19 【问题描述】:我定义了以下 Cloudformation 模板,我想从参数文件中传递公钥。 “MyPublicKey”变量是字符串类型的。我通过使用来引用这个变量
EncodedKey !Ref MyPublicKey
在 PublicKeyConfig 下,如下所示。
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
MyPublicKey:
Type: String
Description: 'Public key for some purpose'
NoEcho: true
Resources:
CloudfrontPublicKey:
Type: AWS::CloudFront::PublicKey
Properties:
PublicKeyConfig:
CallerReference: 'some-caller-reference'
Comment: 'Public key for signed url'
Name: 'cloudfront-public-key'
EncodedKey: !Ref MyPublicKey
...
parameter.json 文件看起来像这样。公钥在原始 .pem 文件中是多行的,但我在字符串中添加了换行符“\n”,只要有换行符。
[
"ParameterKey": "MyPublicKey",
"ParameterValue": "-----BEGIN PUBLIC KEY-----\naaaa\nbbbb\n-----END PUBLIC KEY-----"
,
]
尝试更新堆栈时,我收到以下错误:
Invalid request provided: AWS::CloudFront::PublicKey
好像不能导入公钥。
【问题讨论】:
我认为按照create-public-key,最后的编码密钥中应该还有一个\n
字符。只是预感。
@samtoddler 没用。
只是缺少编码,请关闭我附加的示例文档,我不确定您的密钥是什么样的,以及您是如何生成它的。如果是通过 CLI,它已经被编码了。
我使用这些命令来生成密钥:'openssl genrsa -out private_key.pem 2048' 和 ''openssl rsa -pubout -in private_key.pem -out public_key.pem"。
您的密钥应如下所示-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy/a9J+kUsH97bcrAZ7AR\nw/eT/RB9pxGyCWNZpllUqjAxBCqemfoXAH/3SEW+9GjRHOTCDHP8Ds1VUDmh2vZn\nm3SOUHdcWZkCAjhPxmuiU9rhcd3Ti1A9fNv9S8rM+GAA2ElLmHOoXbNHulWqvJO6\nwym57g1uZds3StmHQgWKWvOi792PAgjZUKjx0CD3AyL2ILTjXascuuzaI7bIAiqV\nup7J/3scpbTJpd17hLTzFVjYk/QX20v62s0LS+M/LSKf9yg22ezJzOTaoQA738hI\n1QphXi3LZAcp1uiJNIas6emtaSgBgFp+vHOLJmQQTSADMExzcodnxshBX1h+Ljoy\nSQIDAQAB\n-----END PUBLIC KEY-----\n
。如您所见,此键中有多个换行符。
【参考方案1】:
基于 cmets,在传递值时需要额外的 \n
字符,并且应将 Ref
替换为用于放置字符串的 Sub
函数。
Resources:
CloudfrontPublicKey:
Type: AWS::CloudFront::PublicKey
Properties:
PublicKeyConfig:
CallerReference: 'some-caller-reference'
Comment: 'Public key for signed url'
Name: 'cloudfront-public-key'
EncodedKey: !Sub "$MyPublicKey"
以下是内联键示例:
生成密钥:
openssl genrsa -out private_key.pem 2048
openssl rsa -pubout -in private_key.pem -out public_key.pem
Cloudformationt 模板:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
CloudfrontPublicKey:
Type: AWS::CloudFront::PublicKey
Properties:
PublicKeyConfig:
CallerReference: 'some-caller-reference'
Comment: 'Public key for signed url'
Name: 'cloudfront-public-key'
EncodedKey: |
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsG0grTw5uHbO4CkFVyqN
lKLGd9ZJrj6l68QU20SzrF7jgQtzE7VKfHxWfzE5FDKF1qKVLT0mURjlRfRPUXaT
sZYsnKv+cTYkraewdLqbVuN7JII2D/cEXTYRn7849kGKycl3YMXeJeBStbLSPWfh
MNJZnlFnEX6DkYtwk0Ae0bQ3WT1Be/Xhe4pqSQsnU+InSDkIfA+4UTRLa0kTCgON
8BjcNloJE3NbLYshQPconb8pA+3jjkMF0QAH6rtc452G7CuS3KBfVQwWUeWE77kK
wQQir6YFvKP3pG8Ls55FxXBTCCNJl5LZcHt1D0cZmuoSLJj2mVzJgKGyLTdoIwAW
6QIDAQAB
-----END PUBLIC KEY-----
列表键:
aws cloudfront list-public-keys|jq .PublicKeyList.Items[1]
输出:
"Id": "08ZCTRKADSADASDAS",
"Name": "cloudfront-public-key",
"CreatedTime": "2021-02-27T10:25:43.076Z",
"EncodedKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsG0grTw5uHbO4CkFVyqN\nlKLGd9ZJrj6l68QU20SzrF7jgQtzE7VKfHxWfzE5FDKF1qKVLT0mURjlRfRPUXaT\nsZYsnKv+cTYkraewdLqbVuN7JII2D/cEXTYRn7849kGKycl3YMXeJeBStbLSPWfh\nMNJZnlFnEX6DkYtwk0Ae0bQ3WT1Be/Xhe4pqSQsnU+InSDkIfA+4UTRLa0kTCgON\n8BjcNloJE3NbLYscZmuoSLJj2mVzJgKGyLTdoIwAW\n6QIDAQAB\n-----END PUBLIC KEY-----\n",
"Comment": "Public key for signed url"
Public key creation in AWS cloudformation giving following error: Invalid request provided: AWS::CloudFront::PublicKey 已回答。
【讨论】:
必须将 'EncodedKey: !Ref MyPublicKey' 更改为 'EncodedKey: !Sub "$PublicKey "以上是关于如何从 cloudformation 模板中的参数文件传递公钥?的主要内容,如果未能解决你的问题,请参考以下文章
将多个参数从外部文件传递到 cloudformation 模板并使用带有 ref 的值
如何在存储桶名称中使用变量 AWS Cloudformation
从 CloudFormation 模板中的 DropDownList 中选择多个值