EC2 实例中的访问密钥不存在

Access key in EC2 instance does not exist

我创建了一个名为 "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.

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

  1. 您不应该在线发布访问密钥和秘密密钥。
  2. 您不应该获取访问密钥并以这种方式使用它。只需使用 Boto3(或任何其他 AWS SDK,或 AWS CLI)而不指定任何 access/secret 键,它将自动使用分配给它所在的 EC2 实例的 IAM 角色 运行。

关于这件事的一些事情:

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

  2. 元数据服务 returns 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

    Note that if you've launched an EC2 instance with an IAM role configured, there's no explicit configuration you need to set in boto3 to use these credentials. Boto3 will automatically use IAM role credentials if it does not find credentials in any of the other places listed above.

    所以对您来说,如果您使用 boto3 直接在实例上 运行 编写代码,您可以直接创建 boto3.resource 而无需指定访问密钥或机密。