【问题标题】:AWS boto3 - InvalidToken Error when calling the GetObject operationAWS boto3 - 调用 GetObject 操作时出现 InvalidToken 错误
【发布时间】:2020-12-11 12:33:36
【问题描述】:

我目前正尝试通过 sam local invoke 命令在本地调用 lambda 函数,但我在 GetObject 操作中不断收到 InvalidToken 错误。

我的尝试:

  • 由于我在ap-northeast-2 区域上运行所有内容,因此我仔细检查了 我的配置文件.aws 文件夹设置为同一区域。
  • 我已尝试通过 boto3 会话打印(虽然不推荐)凭据,并确认使用的凭据与凭据文件夹中的凭据相同(那里唯一的凭据)
  • 我尝试在我的调用命令中添加 --region ap-northeast-2 标志,但它给出了同样的错误。
  • 我检查了当前用户对 S3 资源具有完全访问权限(它具有管理员角色)。我也尝试过分离和重新附加角色(删除配置和凭据文件并使用另一个管理员角色再次运行 aws configure)但没有运气。

还有什么我可能忘记的吗? 下面是代码和日志输出。在此先感谢:)

# imports omitted
logger.info('Starting...')
s3 =  boto3.client('s3')
logger = logging.getLogger()
logger.setLevel(logging.INFO)

session = boto3.Session()
credentials = session.get_frozen_credentials()
print(credentials.access_key, credentials.secret_key, credentials.token)

def load_model(): # handler function 
    logger.info('Loading model from S3')
    obj = s3.get_object(Bucket=MODEL_BUCKET, Key=MODEL_KEY )
    # obj = s3.Object(bucket_name='ml-project-paul-kang', key='fastai-models/lesson1/model.tar.gz')
    logger.info('Model loading complete')
    bytestream = io.BytesIO(obj['Body'].read()) # further code omitted

这是我运行sam local invoke PyTorchFunction -n env.json -e event.json后得到的:

Invoking app.lambda_handler (python3.6)
arn:aws:lambda:ap-northeast-2:<ID>:layer:pytorch-p36:1 is already cached. Skipping download
Requested to skip pulling images ...

[INFO]  2020-08-22T08:18:22.685Z                Starting...
<CURRENT_USER_ACCESS_KEY> <CURRENT_USER_SECRET_KEY> (null)
[INFO]  2020-08-22T08:18:22.685Z                Model Bucket is ml-project
[INFO]  2020-08-22T08:18:22.685Z                Model Prefix is fastai-models/lesson1/model.tar.gz
[INFO]  2020-08-22T08:18:22.686Z                Loading model from S3
module initialization error: An error occurred (InvalidToken) when calling the GetObject operation: The provided token is malformed or otherwise invalid.

【问题讨论】:

  • 您的 IAM 用户是否有 MFA 政策?
  • 不,我有一个使用 MFA 的 root 用户,但我正在使用的当前 IAM 用户拥有用于 cli 配置的密钥对和用于 AWS 控制台的 id/pw。
  • 通过从您的 cli 调用 sts get-caller-identity 检查凭据属性。
  • 我认为您必须创建访问密钥并将其用于 API,而不是用户 ID。当有人尝试调用 API 时,用户 ID 用于限制主体。有什么理由使用用户 ID 作为密钥?这不是通常的方式。
  • 对不起,如果我的话有误导性。所以我确实有我的访问密钥发布并存储在 .aws/credentials 中,我认为 sts get-caller-identity 返回访问密钥。这就是为什么当我运行该命令时我认为它给出了一个不同的访问密钥,而它只是一个用户 ID。

标签: amazon-web-services amazon-s3 boto3 aws-sam


【解决方案1】:

我认为您的 s3 存储桶不在ap-northeast-2 区域。您可以在 s3 控制台上进行检查。如果不是,则需要在代码中传递区域,如下所示。

s3 =  boto3.client('s3', region_name='ap-northeast-2')

【讨论】:

  • 感谢您的建议。我已经这样编辑了我的代码,它给出了一个RequestTimeTooSkewed 错误。所以我使用sudo ntpdate -u in.pool.ntp.org 命令将时间与AWS 服务器同步。现在我又得到了原来的错误......
  • 你试过从终端aws s3 list-objects
  • 我尝试通过aws s3api get-bucket-location --bucket &lt;BUCKET-NAME&gt; 识别该区域,它返回'ap-northeast-2'!
猜你喜欢
  • 2020-02-03
  • 2018-12-07
  • 2018-06-08
  • 2021-09-23
  • 1970-01-01
  • 2017-09-28
  • 2022-07-08
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多