Ansible 无法上传 AWS public 密钥 - 错误的 AWS 凭证

Ansible cannot upload AWS public key - wrong AWS credentials

我正在尝试将自定义 Public 密钥对上传到我的 Amazon AWS 帐户,因为我想使用自定义生成的密钥对与 AWS 进行通信。我正在尝试使用 Ansible 的 ec2_key 模块执行此上传。

这是我到目前为止所做的:

第 1 步。注册亚马逊 AWS 帐户 here。我输入了 "AWS Account Name" 和密码。

第 2 步。安装 Python 包 AWS CLIboto:

$ pip install awscli boto

第 3 步。生成 SSH 密钥对(我也使用了 Ansible):

- name: Generate a 2048-bit SSH key for user
  user:
    name: "{{ ansible_ssh_user }}"
    generate_ssh_key: yes
    ssh_key_bits: 2048
    ssh_key_file: ~/.ssh/id_rsa

第 4 步。我将 public 密钥 (~/.ssh/id_rsa.pub) 的内容复制到 /home/username/.aws/credentials

第 5 步。使用 Ansible task 使用 Ansible 将 public 密钥上传到 Amazon AWS:

vars:
  aws_access_key_id: my_key_name
  aws_region: "us-west-2"
  aws_secret_access_key: "ssh-rsa Y...r"

tasks:
  - name: example3 ec2 key
    ec2_key:
      name: "{{ aws_access_key_id }}"
      region: "{{ aws_region }}"
      key_material: "{{ aws_secret_access_key }}"
      state: present
      force: True
      validate_certs: yes

第 5 步的输出是:

An exception occurred during task execution. ..."module_stderr": "Traceback (most
recent call last):\n  File \"/tmp/ansible_WqbqHU/ansible_module_ec2_key.py\",...
raise self.ResponseError(response.status, response.reason, 
body)\nboto.exception.EC2ResponseError: EC2ResponseError: 401 Unauthorized\n<?xml
version=\"1.0\" encoding=\"UTF-8\"?>
\n<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to
validate the provided access credentials</Message></Error></Errors>...

这是我的/home/username/.aws/credentials(我刚编了一些key_id):

[default]
aws_access_key_id = my_key_name
aws_secret_access_key = ssh-rsa Y...r

这是我的 /home/username/.aws/config:

[default]
output = json
region = us-west-2

这两个文件似乎都符合 AWS 文档要求 here

附加信息:

  1. 主机系统:Ubuntu 17.10(非根用户)
  2. 2 个 Ansible 任务 运行 来自单独的 Ansible 剧本 - 首先是 sshkeygen 剧本 运行,然后 ec2_key 剧本是 运行。 Ansible 剧本不是 运行 使用 become.
  3. Ansible 版本 = ansible==2.4.1.0
  4. Boto 版本 = boto==2.48.0, botocore==1.7.47

问题

  1. 如何指示 AWSCLI 与我的在线账户通信(第 1 步)?似乎我在使用 ec2_key 模块的 Ansible 任务中的某个地方错过了这一步。
  2. 目前,我在 (a) 第二个 Ansible 任务中有相同的 public 密钥来上传 public 密钥和 (b) /home/username/.aws/credentials。是否缺少此 Ansible 任务 something/incorrect?应该有第二个 public 键吗?

您的凭据中的秘密访问密钥看起来有误。如果您 运行 来自附加了 IAM 角色的 EC2 实例,那应该与 IAM 用户关联或留空;不是您要上传的密钥。

您已将 SSH public 密钥放入 secret_access_key 字段。

我看起来是这样的(当然这里的字母混合和替换,不是我真正的钥匙):

[Credentials]
    aws_access_key_id = FMZAIQGTCHSLGSNDIPXT
    aws_secret_access_key = gcmbyMs1Osj3ISCSasFtEx7sVCr92S3Mvjxlcwav 

如果您转到 IAM (https://console.aws.amazon.com/iam),您可以重新生成您的密钥。 您需要转到 IAM->Users,单击您的用户名,单击 Security Credentials,然后 "Create Access Key".

如果您刚刚设置帐户,您可能没有 IAM 用户,只有所谓的根帐户用户(您注册的用户)。在这种情况下,单击主屏幕顶部的您的姓名,然后单击 select 我的安全凭证。您可能会收到警告,但不用担心,您不是 运行 大型组织。单击访问密钥下拉菜单并单击创建新访问密钥(您可能有 none)。这将为您提供所需的密钥。将它们保存在某个地方,因为当您离开屏幕时,您将不再有机会看到秘密访问密钥,只能看到密钥 ID。

但是,如果您使用的是附加了角色的计算机,则根本不需要凭据,boto 应该会选择它们。

你可以通过 SSH 连接到主机吗?我认为未经授权的错误来自您尝试访问主机。 就像是: ssh ec2-user@165.0.0.105 - i my_key.pem

您可以在 aws 控制台中看到您的 public ip 地址。如果您在那里遇到错误,请仔细检查实例是否接受安全配置文件中的 ssh 流量。