Amazon web services 我们可以通过AWS Cloudformation动态创建密钥对并将.PEM文件复制到EC2 Linux实例吗

Amazon web services 我们可以通过AWS Cloudformation动态创建密钥对并将.PEM文件复制到EC2 Linux实例吗,amazon-web-services,amazon-ec2,amazon-cloudformation,aws-cloudformation-custom-resource,Amazon Web Services,Amazon Ec2,Amazon Cloudformation,Aws Cloudformation Custom Resource,我的需求是创建一个EC2实例,该实例将从相同的Cloudformation模板动态创建密钥对。目前,我正在从AWS控制台创建密钥对,并通过Cloudformation将其分配给EC2实例,方法是获取用户的输入 我检查了AWS文档,发现可以从AWS控制台创建密钥对 是否存在可以从Cloudformation创建密钥对并复制实例中的.PEM文件的方法。这是关于私钥管理的 EC2密钥对有两个组件。公共和私人的。公钥是AWS在创建实例时存储并推送到实例的内容。私钥从不存储在AWS中。从您使用控制台或通过

我的需求是创建一个EC2实例,该实例将从相同的Cloudformation模板动态创建密钥对。目前,我正在从AWS控制台创建密钥对,并通过Cloudformation将其分配给EC2实例,方法是获取用户的输入

我检查了AWS文档,发现可以从AWS控制台创建密钥对


是否存在可以从Cloudformation创建密钥对并复制实例中的.PEM文件的方法。

这是关于私钥管理的

EC2密钥对有两个组件。公共和私人的。公钥是AWS在创建实例时存储并推送到实例的内容。私钥从不存储在AWS中。从您使用控制台或通过CLI创建密钥对的那一刻起,您就有机会将其存储在您的计算机上

作为堆栈初始化的一部分,Cloud formation无法在您的计算机上存储私钥

你可以考虑两步方法:< /P> 1) 创建密钥或从计算机导入密钥。无论采用哪种方式,您都可以并且只有您可以访问私钥部分

aws ec2 import-key-pair
or
aws ec2 create-key-pair
2) 在cloudformation中使用这个新创建的键

  SshKeyParameter:
    Description: SSH Keypair to login to the instance
    Type: AWS::EC2::KeyPair::KeyName
...
      KeyName: !Ref SshKeyParameter

这是关于私钥管理的

EC2密钥对有两个组件。公共和私人的。公钥是AWS在创建实例时存储并推送到实例的内容。私钥从不存储在AWS中。从您使用控制台或通过CLI创建密钥对的那一刻起,您就有机会将其存储在您的计算机上

作为堆栈初始化的一部分,Cloud formation无法在您的计算机上存储私钥

你可以考虑两步方法:< /P> 1) 创建密钥或从计算机导入密钥。无论采用哪种方式,您都可以并且只有您可以访问私钥部分

aws ec2 import-key-pair
or
aws ec2 create-key-pair
2) 在cloudformation中使用这个新创建的键

  SshKeyParameter:
    Description: SSH Keypair to login to the instance
    Type: AWS::EC2::KeyPair::KeyName
...
      KeyName: !Ref SshKeyParameter
安东的回答是正确的。 但是,也有使用其他工具的替代方案。通常,它们允许自动导入公钥

Ansible:

地形:

甚至:安东的回答是正确的。 但是,也有使用其他工具的替代方案。通常,它们允许自动导入公钥

Ansible:

地形:


甚至:

遵循安东的答案,作品也很好。编写的shell脚本正在启动一个cloudformation模板,如果没有预设密钥,脚本将创建它并将其上传到s3 bucket

#!/bin/bash
Region=eu-central-1
key=myapp-engine-$Region
Available_key=`aws ec2 describe-key-pairs --key-name $key | grep KeyName | awk -F\" '{print $4}'`

if [ "$key" = "$Available_key" ]; then
    echo "Key is available."
else
    echo "Key is not available: Creating new key"
    aws ec2 create-key-pair --key-name $key --region $Region > myapp-engine-$Region.pem
    aws s3 cp myapp-engine-$Region.pem s3://mybucket/myapp-engine-$Region.pem
fi

##### create stack  #########

/usr/local/bin/aws cloudformation deploy  --stack-name myapp-engine --template-file ./lc.yml --parameter-overrides file://./config.json  --region $Region
下面是一个CloudFormation启动配置堆栈的示例,您可以在其中传递密钥

Resources:
  renderEnginelc:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId:
        Ref: "AMIID"
      SecurityGroups:
        - Fn::ImportValue:
            !Sub "${SGStackName}-myapp"
      InstanceType:
        Ref: InstanceType
      LaunchConfigurationName : !Join [ "-", [ !Ref Environment, !Ref ApplicationName, lc ] ]
      KeyName: !Join [ "-", [ !Ref KeyName, !Ref AWS::Region ] ]

传递KyNyNm的参数值是“MyAPP引擎”,它将根据AWS::区域

< P>考虑Anton的回答,其工作精细。编写的shell脚本正在启动一个cloudformation模板,如果没有预设密钥,脚本将创建它并将其上传到s3 bucket

#!/bin/bash
Region=eu-central-1
key=myapp-engine-$Region
Available_key=`aws ec2 describe-key-pairs --key-name $key | grep KeyName | awk -F\" '{print $4}'`

if [ "$key" = "$Available_key" ]; then
    echo "Key is available."
else
    echo "Key is not available: Creating new key"
    aws ec2 create-key-pair --key-name $key --region $Region > myapp-engine-$Region.pem
    aws s3 cp myapp-engine-$Region.pem s3://mybucket/myapp-engine-$Region.pem
fi

##### create stack  #########

/usr/local/bin/aws cloudformation deploy  --stack-name myapp-engine --template-file ./lc.yml --parameter-overrides file://./config.json  --region $Region
下面是一个CloudFormation启动配置堆栈的示例,您可以在其中传递密钥

Resources:
  renderEnginelc:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId:
        Ref: "AMIID"
      SecurityGroups:
        - Fn::ImportValue:
            !Sub "${SGStackName}-myapp"
      InstanceType:
        Ref: InstanceType
      LaunchConfigurationName : !Join [ "-", [ !Ref Environment, !Ref ApplicationName, lc ] ]
      KeyName: !Join [ "-", [ !Ref KeyName, !Ref AWS::Region ] ]

传递KyNyNm的参数值是“MyApp引擎”,它将根据AWS考虑一个区域:区域A/P>在AWS中,无论如何,我可以安全地保存.PEM文件,同时在CuldDebug中创建EC2实例,我可以在EC2机器上下载文件。您可以使用实例/容器创建嵌套模板,该实例/容器将使用ssh keygen生成密钥,向AWS EC2注册该密钥,将私钥保存在AWS Secrets中,并将密钥名称作为模板输出返回。但这似乎太麻烦了,而且可能会违反安全最佳实践。AWS中是否有任何地方可以安全保存.PEM文件,并且在从cloudformation创建EC2实例时,我可以在EC2机器上下载该文件。理论上,您可以使用实例/容器创建嵌套模板,该实例/容器将使用ssh keygen生成密钥,向AWS EC2注册该密钥,将私钥保存在AWS Secrets中,并将密钥名称作为模板输出返回。但这似乎是一个太大的麻烦,而且很可能与安全最佳实践背道而驰。