Amazon web services 在CI/CD中使用云形成创建Ec2 SSH密钥

Amazon web services 在CI/CD中使用云形成创建Ec2 SSH密钥,amazon-web-services,amazon-ec2,ssh,Amazon Web Services,Amazon Ec2,Ssh,考虑以下CI/CD场景: 在开发阶段,我希望使用来自CF的Ec2实例和Ec2密钥对部署堆栈 从文档中,我了解了云形成资源,可以指向一个现有的密钥,该密钥可以从AWS管理控制台创建,没有其他方法 我想用堆栈创建密钥,以便在实例中使用它进行ssh。我将通过一个env var向SSH提供该值,因此我将是唯一知道该键值的人 有人知道这种情况的解决方案吗?遗憾的是,您无法在普通云信息(CFN)中创建ssh密钥对。这是不受支持的。相反,如果您确实想使用CFN管理密钥对创建,则必须使用 资源将采用lambd

考虑以下CI/CD场景:

在开发阶段,我希望使用来自CF的Ec2实例和Ec2密钥对部署堆栈

从文档中,我了解了云形成资源,可以指向一个现有的密钥,该密钥可以从AWS管理控制台创建,没有其他方法

我想用堆栈创建密钥,以便在实例中使用它进行ssh。我将通过一个env var向SSH提供该值,因此我将是唯一知道该键值的人


有人知道这种情况的解决方案吗?

遗憾的是,您无法在普通云信息(CFN)中创建ssh密钥对。这是不受支持的。相反,如果您确实想使用CFN管理密钥对创建,则必须使用

资源将采用lambda函数的形式,该函数将使用AWS SDK,例如,并将生成的私钥保存在SSM参数存储中


任何需要生成密钥的进一步应用程序都可以从存储中检索if。

AWS中仅控制台操作通常不是一件事。实际上,控制台中的所有操作都使用底层公共API(存在一些例外情况)

如果您真的想在CloudFormation中创建EC2密钥对,可以通过自定义资源来实现。这本质上是一个Lambda函数,可以执行任意操作,可以返回值,也可以不返回值

创建密钥对是通过EC2 API中的
CreateKeyPair
操作完成的,这是有文档记录的。您可以在自定义资源中使用此API调用来创建密钥对,将公钥保存在安全的地方(例如,Secrets Manager),并将密钥对的名称作为属性返回

我建议您不要这样做。确保私钥仅可供您访问并非小事

我建议您以实例能够使用EC2实例连接的方式配置CloudFormation模板。这允许您使用EC2 API向实例中注入临时SSH密钥以建立连接,甚至可以从浏览器使用会话管理器。我更喜欢这些选项,因为它们使用临时凭证和/或更容易审核

参考资料


你比我抢先一步:因为已经分享了额外的知识,所以我决定这么做。我不知道你的建议是什么意思?你有我能读的CF吗?您的意思是引用我已经在AWS控制台中建立的密钥的名称,并提供SSM资源吗?如果你能在回答中提供,我认为CF资源会解决问题?我认为这篇文章解释了如何使用boto创建密钥对。此外,我认为您建议在SSM中存储ssh?我的建议是避免使用这些长寿命的主凭据。要使用实例连接等,您只需要为实例提供一个具有与系统管理员对话的适当权限的角色。之后,您可以使用AWS CLI使用短期SSH密钥将SSH会话获取到该实例中。如果我需要为应用程序授予权限,以便将文件传输到ssh,该怎么办?SSM托管实例是否可以用于此类作业?