【问题标题】:Access key in EC2 instance does not existEC2 实例中的访问密钥不存在
【发布时间】:2016-12-21 17:12:24
【问题描述】:

我创建了一个名为“AMIRole”的新 IAM 角色,并为其附加了“AmazonS3FullAccess”策略。现在我用这个 IAM 角色启动一个 EC2 实例。

当我通过 SSH 连接到实例时,我可以像这样访问 AWS 访问密钥和秘密密钥:

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/AMIRole
{
  "Code" : "Success",
  "LastUpdated" : "2016-12-21T16:05:26Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ABCDEFJK",
  "SecretAccessKey" : "SECRET",
  "Token" : "TOKEN",
  "Expiration" : "2016-12-21T22:38:16Z"
}

但是,当我尝试使用此角色创建存储桶时,我收到此 AWS KEY 不存在的错误消息。

>>> import boto3
>>> s3 = boto3.resource("s3", aws_access_key_id="ABCDEFJK", aws_secret_access_key="SECRET")
>>> s3.create_bucket(Bucket="something-specific-uuid")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/boto3/resources/factory.py", line 520, in do_action
    response = action(self, *args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/boto3/resources/action.py", line 83, in __call__
    response = getattr(parent.meta.client, operation_name)(**params)
  File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 159, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/lib/python2.7/dist-packages/botocore/client.py", line 494, in _make_api_call
    raise ClientError(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the CreateBucket operation: The AWS Access Key Id you provided does not exist in our records.

我的目标是创建一个具有轮换访问/密钥的 AMI,以便我可以将 AMI 放在 AWS Marketplace 上。

【问题讨论】:

  • 我已从帖子的当前版本编辑了您的访问密钥和秘密密钥,因为如果它们是正确的凭据,它们仍然仍然有效。为了完全安全,我建议invalidating the credentials(或删除角色并在不重要时重新创建)。

标签: amazon-web-services amazon-s3 amazon-ami aws-marketplace


【解决方案1】:

关于这个的几件事:

  1. 附加到实例的角色授予它特定的资源策略和对不同事物的访问权限。 AMI 在这方面无关紧要。如果您将 AMI 放到 AWS Marketplace,用户将无法访问您当前使用的相同角色。

  2. 元数据服务返回AccessKeyIdSecretAccessKeyToken。如果您尝试使用这些凭据,则必须指定所有这三个,因此您必须为 boto3 指定类似的内容:

    import boto3
    
    client = boto3.client(
        's3',
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )
    
  3. 当使用像 boto3 这样的 SDK 在实例上运行代码时,您根本不需要提供凭据。 boto3 将使用 IAM role's credentials from the metadata service 如果找不到任何其他形式的凭据

    请注意,如果您已启动配置了 IAM 角色的 EC2 实例,则无需在 boto3 中设置显式配置即可使用这些凭证。如果 Boto3 在上面列出的任何其他位置都找不到凭证,它将自动使用 IAM 角色凭证。

    因此,对于您而言,如果您使用 boto3 直接在实例上运行代码,您可以只创建 boto3.resource 而无需指定访问密钥或机密。

【讨论】:

  • 3 - 这是很好的信息。谢谢。 2 - 我不确定这是如何工作的。我的目标是将我的应用程序放到 AWS Marketplace 上。我的应用程序要求用户输入 Accesskey、密钥和 s3 存储桶名称。由于 AWS 不允许这样做,我认为创建具有实例角色的 AMI 会起作用。我的另一个问题为我的最终目标提供了更多背景stackoverflow.com/questions/41169163/…
  • @Anthony 我会看看你的其他帖子,看看我是否可以提供指导。
【解决方案2】:
  1. 您不应在线发布访问密钥和秘密密钥。
  2. 您不应该获取访问密钥并以这种方式使用它。只需使用 Boto3(或任何其他 AWS 开发工具包或 AWS CLI)而不指定任何访问/密钥,它就会自动使用分配给运行它的 EC2 实例的 IAM 角色。

【讨论】:

  • 1 - 我明白了。我已经改变了它们。 2 - 我必须以这种方式使用访问密钥,因为我计划将 AMI 投放市场。我的另一个问题可能会提供更多上下文stackoverflow.com/questions/41169163/…
  • 我相信用户需要创建适当的 IAM 角色并在使用您的 AMI 时选择它。您或许可以为您的 AMI 用户提供一个 CloudFormation 模板。
猜你喜欢
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2019-05-07
  • 2011-12-14
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多