Amazon ec2 如何为elastic beanstalk实例添加多个键?
有一个很好的问题,但我注意到,通过这种方法,只能添加一个SSH密钥Amazon ec2 如何为elastic beanstalk实例添加多个键?,amazon-ec2,amazon-web-services,ssh-keys,amazon-elastic-beanstalk,Amazon Ec2,Amazon Web Services,Ssh Keys,Amazon Elastic Beanstalk,有一个很好的问题,但我注意到,通过这种方法,只能添加一个SSH密钥 如何向一个实例添加多个SSH密钥?有没有一种方法可以自动向新实例添加多个密钥?实现这一点的一种方法是创建一个用户数据脚本,该脚本将要使用的其他密钥对的公钥附加到~ec2 user/.ssh/authorized_密钥中,并使用该用户数据启动实例,例如: #! echo ssh-rsa AAAB3N...QcGskx keyname >> ~ec2-user/.ssh/authorized_keys echo ssh-
如何向一个实例添加多个SSH密钥?有没有一种方法可以自动向新实例添加多个密钥?实现这一点的一种方法是创建一个用户数据脚本,该脚本将要使用的其他密钥对的公钥附加到~ec2 user/.ssh/authorized_密钥中,并使用该用户数据启动实例,例如:
#!
echo ssh-rsa AAAB3N...QcGskx keyname >> ~ec2-user/.ssh/authorized_keys
echo ssh-rsa BBRdt5...LguTtp another-key >> ~ec2-user/.ssh/authorized_keys
不支持,Elastic Beanstalk仅支持单个密钥对。您可以手动将SSH密钥添加到
authorized_keys
文件中,但Elastic Beanstalk工具不知道这些密钥。根据Jim Flanagan的回答,您可以通过在应用程序源目录中创建.ebextensions/app.config
将密钥添加到每个实例中,其中包含以下内容:
commands:
copy_ssh_key_userA:
command: echo "ssh-rsa AAAB3N...QcGskx userA" >> /home/ec2-user/.ssh/authorized_keys
copy_ssh_key_userB:
command: echo "ssh-rsa BBRdt5...LguTtp userB" >> /home/ec2-user/.ssh/authorized_keys
创建名为
.ebextensions/authorized_keys.config的文件是另一种方法
files:
/home/ec2-user/.ssh/authorized_keys:
mode: "000400"
owner: ec2-user
group: ec2-user
content: |
ssh-rsa AAAB3N...QcGskx keyname
ssh-rsa BBRdt5...LguTtp another-key
文件authorized_keys.config
的名称是任意的。结合Rhuncks和rch850的答案,这里有一个干净的方法来添加额外的SSH密钥,同时通过AWS控制台保留一组:
files:
/home/ec2-user/.ssh/extra_authorized_keys:
mode: "000400"
owner: ec2-user
group: ec2-user
content: |
ssh-rsa AAAB3N...QcGskx keyname
ssh-rsa BBRdt5...LguTtp another-key
commands:
01_append_keys:
cwd: /home/ec2-user/.ssh/
command: sort -u extra_authorized_keys authorized_keys -o authorized_keys
99_rm_extra_keys:
cwd: /home/ec2-user/.ssh/
command: rm extra_authorized_keys
请注意,只有当私钥文件与AWS控制台中定义的私钥具有相同的名称时,eb ssh
才会起作用。
最简单的方法-如@Rhuncks,但在第一个副本上有一个“>”符号:
关于。您可以将公钥上载到AWS上的IAM用户,而不是运行echo
并将密钥存储在Git上:
commands:
copy_ssh_key_userA:
command: rm -f /home/ec2-user/.ssh/authorized_keys;aws iam list-users --query "Users[].[UserName]" --output text | while read User; do aws iam list-ssh-public-keys --user-name "$User" --query "SSHPublicKeys[?Status == 'Active'].[SSHPublicKeyId]" --output text | while read KeyId; do aws iam get-ssh-public-key --user-name "$User" --ssh-public-key-id "$KeyId" --encoding SSH --query "SSHPublicKey.SSHPublicKeyBody" --output text >> /home/ec2-user/.ssh/authorized_keys; done; done;
向Elastic Beanstalk EC2实例添加多个SSH密钥的最动态的方法
第一步
在IAM中创建一个组。将其称为beanstalk访问
。将需要SSH访问权限的用户添加到IAM中的该组。还要将他们的公共ssh密钥添加到他们的IAM安全凭据中
步骤2
下面的部署脚本将使用名为jq
()的便捷Linux工具解析来自AWS CLI的JSON数据,因此我们需要将其添加到.ebextensions中:
packages:
yum:
jq: []
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/980_beanstalk_ssh.sh":
mode: "000755"
owner: ec2-user
group: ec2-user
content: |
#!/bin/bash
rm -f /home/ec2-user/.ssh/authorized_keys
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
readarray -t users_array < <(jq -r '.[]' <<<"$users")
declare -p users_array
for i in "${users_array[@]}"
do
user_keys=$(aws iam list-ssh-public-keys --user-name $i)
keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
for j in "${keys_array[@]}"
do
ssh_public_key=$(aws iam get-ssh-public-key --encoding SSH --user-name $i --ssh-public-key-id $j | jq '.["SSHPublicKey"] .SSHPublicKeyBody' | tr -d \")
echo $ssh_public_key >> /home/ec2-user/.ssh/authorized_keys
done
done
chmod 600 /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
步骤3
将以下BASH部署脚本添加到.ebextensions:
packages:
yum:
jq: []
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/980_beanstalk_ssh.sh":
mode: "000755"
owner: ec2-user
group: ec2-user
content: |
#!/bin/bash
rm -f /home/ec2-user/.ssh/authorized_keys
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
readarray -t users_array < <(jq -r '.[]' <<<"$users")
declare -p users_array
for i in "${users_array[@]}"
do
user_keys=$(aws iam list-ssh-public-keys --user-name $i)
keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
for j in "${keys_array[@]}"
do
ssh_public_key=$(aws iam get-ssh-public-key --encoding SSH --user-name $i --ssh-public-key-id $j | jq '.["SSHPublicKey"] .SSHPublicKeyBody' | tr -d \")
echo $ssh_public_key >> /home/ec2-user/.ssh/authorized_keys
done
done
chmod 600 /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
(在下面的代码片段中)使用AWS CLI,我们将获得beanstalk access
组中的用户列表,然后将该JSON列表输送到jq
中,以仅提取该`$users列表
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
(在下面的代码片段中)这里,我们将JSON$users
列表转换为BASH数组,并将其称为$users\u数组
readarray-t users\u array<这是真的,但这会使通过各种AWS工具管理密钥变得更加困难。AWS中有什么方法可以做到这一点吗?Elastic Beanstalk不允许您指定用户数据。您可以在源代码树中为部署的应用程序版本使用类似.ebextensions/app.config
的文件来添加其他命令。请看,这种方法的问题在于,它将在每次部署时连接文件。@rch850提出的解决方案没有这个问题。当我复制粘贴这段代码时,我得到了一些不是空格的坏字符,请注意,您可以通过添加额外的重复数据消除命令来避免@RobertoSchneiders提到的连接问题:command:sort-u/home/ec2 user/.ssh/authorized_key-o/home/ec2 user/.ssh/authorized_key
这非常有效。但是,默认情况下,授权的_密钥已经有一个ssh密钥(创建环境时必须选择一个)您需要记住将该密钥添加到此文件中,否则在部署时它将被擦除,您可能会失去对服务器的访问。^并且要将ssh密钥eb ssh
获取到实例中,并键入cat~ec2 user/。ssh/authorized_keys
,在后续部署期间,它不会每次都附加keyname和另一个密钥吗?在重建环境之前是否会导致复制?@Max不,不会。它将覆盖授权密钥
。这是一个很好的解决方案-我想知道是否可以通过环境变量添加这些文件,在这种情况下,您可以在不重建环境的情况下管理访问权限?不要复制和粘贴现有答案,并应用较小的更改。如果您对现有答案有贡献,请在使用新答案的同时使用共享按钮。下面我的答案解释了如何动态执行此操作:由于aws iam命令:2018-10-16 13:43:24错误[Instance:i-05cc43b96ffc69145]命令在实例上失败,我无法执行此操作。返回代码:1输出:(已截断)…rform:iam:GetGroup on resource:group beanstalk-access@JosephCrawford是否确实创建了名为beanstalk access
的IAM组?然后还要确保有分配给该组的用户。是的,我两个都做了,但这是beanstalk在部署期间返回的错误。此外,我还删除了配置文件并从yum软件包中删除了jq,现在我仍然无法部署,因为它正在尝试对我发现非常奇怪的每个部署运行该命令。ls-la.ebextensions总计16 drwxrwxrwx@4 jcrawford staff 128 10月16日15:03。DRWXRWX@36 jcrawford员工1152 10月16日09:18-rw-r--r--@1 jcrawford staff 744 Sep 18 10:07 composer.config-rw-r--r--@1 jcrawford staff 73 Oct 16 09:53 project.config 2018-10-16 19:05:05将新版本部署到实例的信息。2018-10-16 19:06:09错误[实例:i-05cc43b96ffc69145]命令在实例上失败。返回代码:1输出:(截断)…执行:iam:GetGroup on resource:group BeanstalkAccessFinally能够将环境恢复到运行状态。将在进一步测试启用SSH后克隆我们的QA环境。
user_keys=$(aws iam list-ssh-public-keys --user-name $i)
keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
for j in "${keys_array[@]}"
do
ssh_public_key=$(aws iam get-ssh-public-key --encoding SSH --user-name $i --ssh-public-key-id $j | jq '.["SSHPublicKey"] .SSHPublicKeyBody' | tr -d \")
echo $ssh_public_key >> /home/ec2-user/.ssh/authorized_keys
done
done
chmod 600 /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys