AWS - 无法识别访问密钥ID和秘密访问密钥

时间:2017-12-18 11:56:02

标签: python amazon-web-services boto3

我正在使用AWS,boto3和Pycharm在python上编写一个非常简单的程序,它将一个面部图像与另一个面部图像的另一个面部进行比较。 我写了以下简单的源代码:

import boto3

s3 = boto3.resource('s3',
                    aws_access_key_id = "xxx",
                    aws_secret_access_key = "yyy")

BUCKET = "eyeglasses-images"
KEY_SOURCE = "Foucault.jpg"
KEY_TARGET = "Ricoeur.jpg"


def compare_faces(bucket, key, bucket_target, key_target, threshold=80, region="eu-west-1"):
    rekognition = boto3.client("rekognition", region)
    response = rekognition.compare_faces(
        SourceImage={
            "S3Object": {
                "Bucket": bucket,
                "Name": key,
            }
        },
        TargetImage={
            "S3Object": {
                "Bucket": bucket_target,
                "Name": key_target,
            }
        },
        SimilarityThreshold=threshold,
    )
    return response['SourceImageFace'], response['FaceMatches']


source_face, matches = compare_faces(BUCKET, KEY_SOURCE, BUCKET, KEY_TARGET)

# the main source face
print
"Source Face ({Confidence}%)".format(**source_face)

# one match for each target face
for match in matches:
    print
    "Target Face ({Confidence}%)".format(**match['Face'])
    print
    "  Similarity : {}%".format(match['Similarity'])

但是我收到以下错误:

raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials

(显然代替xxx和yyy我正在使用真正的密钥)

问题是什么?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

问题在于:rekognition = boto3.client("rekognition", region)

因为你没有在这里指定密钥,所以boto3正试图在〜/ .aws中找到凭证文件。更新此项以使用Aniket提到的session对象。您的代码应更改为:

session = boto3.session.Session(
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY
)
rekognition = session.client("rekognition", region)

答案 1 :(得分:0)

您可以先使用会话。例如

session = boto3.Session(
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    aws_session_token=SESSION_TOKEN,
)

然后获取您的资源

s3 = session.resource('s3')

请注意,aws_session_token是可选的,如果您使用STS获取临时会话,则会使用它。

只是说

s3 = boto3.client('s3')
s3 = boto3.resource('s3')

将使用~/.aws/credentials文件中的默认信用卡。所以它不能在你的情况下使用。

如果你可以直接使用 -

会很好
s3 = boto3.client(
    's3',
    # Hard coded strings as credentials, not recommended.
    aws_access_key_id='xx',
    aws_secret_access_key='yy'
)

有关详细信息,请参阅 - boto3 configuration documentation