【发布时间】: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