2

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

我检查了 AWS 文档,发现可以从 AWS 控制台创建 KeyPair。

无论如何可以通过它从 Cloudformation 创建密钥对并在实例中复制 .PEM 文件。

4

3 回答 3

6

这是关于私钥管理的。

EC2 密钥对有两个组件。公立和私立。公钥是 AWS 在创建实例时存储并推送到实例的内容。私钥永远不会存储在 AWS。在您使用控制台或通过 CLI 创建密钥对的那一刻 - 您有一个也是唯一的机会将其存储在您的机器上。

Cloud Formation 无法将私钥存储在您的机器上作为堆栈初始化的一部分。

您可以在这里考虑两步法:

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
于 2020-01-30T14:14:51.637 回答
1

按照安东的回答,它的工作正常。编写启动 cloudformation 模板的 shell 脚本,如果未预设密钥,脚本将创建它并将其上传到 s3 存储桶。

#!/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 ] ]

传递 KeyName 的参数值为“myapp-engine”,它将根据 AWS::Region 考虑一个区域

于 2021-03-11T20:36:05.627 回答
0

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

Ansible:https ://docs.ansible.com/ansible/latest/collections/amazon/aws/ec2_key_module.html#ansible-collections-amazon-aws-ec2-key-module

Terraform:https ://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/key_pair

甚至:https ://binx.io/blog/2017/10/25/deploying-private-key-pairs-with-aws-cloudformation/

于 2021-01-08T04:00:46.050 回答