Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon ec2 如何为elastic beanstalk实例添加多个键?_Amazon Ec2_Amazon Web Services_Ssh Keys_Amazon Elastic Beanstalk - Fatal编程技术网

Amazon ec2 如何为elastic beanstalk实例添加多个键?

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密钥


如何向一个实例添加多个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