考虑以下CI/CD场景:
在开发阶段,我想用CF中的Ec2实例和Ec2密钥对部署我的堆栈。
从文档中我了解到云形成资源,可以指向一个现有的密钥,可以从AWS管理控制台创建,没有其他方法。
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-keypair.html
我想用堆栈创建我的Key,这样我就可以在实例中使用它来ssh。我将通过env var向我的SSH提供该值,因此我将是唯一知道密钥值的人。
有人知道这个场景的解决方案吗?
在AWS中通常不存在仅限控制台的操作。实际上,控制台中所有的操作都使用底层的公共api(存在一些例外)。
如果你真的想在CloudFormation中创建一个EC2密钥对,你可以通过一个自定义资源来实现。这本质上是一个Lambda函数,可以做任意的事情,可以返回值,也可以不返回值。
创建KeyPair是通过EC2 API中的CreateKeyPair
操作完成的,这里有文档说明。您可以在自定义资源中使用此API调用来创建密钥对,将公钥保存在安全的地方(例如秘密管理器),并返回密钥对的名称作为属性。
我建议不要这样做。确保私钥只有您可以访问是很重要的。
我建议您以一种实例能够使用EC2实例连接的方式配置CloudFormation模板。这允许您使用EC2 API将临时SSH密钥注入实例以建立连接,甚至可以从浏览器中使用会话管理器。我更喜欢这些选项,因为它们使用临时凭证和/或更容易审计。
引用
- 建立EC2实例连接
- 设置会话管理器
遗憾的是,不能创建CFN格式的ssh密钥对。这是不支持的。相反,如果您真的想使用CFN管理密钥对创建,则必须使用自定义资源。
资源的形式为lambda函数它将使用AWS SDK,例如create_key_pair,并将生成的私钥保存在SSM参数存储中。
任何需要生成的键的应用程序都可以从存储中检索它。
此功能现在已通过AWS::EC2::KeyPair资源添加到Cloudformation中- ">要让Amazon EC2创建新的密钥对,请省略PublicKeyMaterial属性。当Amazon EC2创建新的密钥对时,私钥被保存到AWS系统管理器参数存储">
不确定这是何时添加的