質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Python

    10254questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • AWS(Amazon Web Services)

    2321questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Python 2.7

    1385questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

s3にアップロードした画像を、boto3でkeyを取得すると、謎の文字列がくっついてきてしまいます・・・

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,281

k_mawa82

score 222

前提・実現したいこと

お分かりの方、ご回答いただけますと大変助かりますm(_ _)m

私は現在、s3にアップロードした画像を画像処理するスクリプトをpythonで書いておりますが、boto3でkeyを取得すると、謎の文字列がくっついてきてしまい、splitなどでもとることができない状態で困っております。この現象と対策お分かりのかたいらっしゃいますでしょうか??

IOError: [Errno 2] No such file or directory: '/media/test.jpg.dAAAfd01'

該当のソースコード(py2.7です)

s3 = boto3.client('s3')

for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key_with_extention = str(record['s3']['object']['key'])
        key = key_with_extention.split(".")[0] + "." + key_with_extention.split(".")[1]
        download_path = '/tmp/{}'.format(key)

        s3.download_file(Bucket=bucket, Key=key ,Filename=download_path) #ここでエラーがでます

試したこと

key_with_extention = str(record['s3']['object']['key'])
は複数パターン試しました。

・strつけないで実行
key_with_extention = record['s3']['object']['key']

・urllib.unquote_plus(event['Records'][0]['s3']['object']['key'])

・urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')

補足情報(言語/FW/ツール等のバージョンなど)

ヒントになりそうな点があります。
'/media/hoge/hoge/test.jpg.dAAAfd01','/media/test.jpg.dAAAfd01' とs3の内部にディレクトリを作った中に画像をアップしたときだけに起きます。
s3の一番上のディレクトリだと(パスが'test.jpg'のみ)、エラーなく稼働しています。

key = '/media/hoge/hoge/test.jpg.dAAAfd01'
のはずなのに、key.split(".")[0]でも分割されないんです・・・これも何かヒントになりそうな気もするのですが・・・う〜ん 困っています・・・・

もう一点ヒントになるかわからないのですが、s3コンソール上だとtest.jpgとだけ出ていて、boto3からアクセスしたときだけに謎も文字列がくっついてきています。

どなたかお力添えくださると大変助かります・・・

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

+1

調べ続けた結果、AWS lambda特有のしばりが原因でした。

AWS lambdaの作業可能ディレクトリはtmpのみなのですが、tmpでは複数階層になっているディレクトリをos.makedirsで作るとエラーになる設定になっているようで、

s3.download_file(Bucket=bucket, Key=key ,Filename=download_path) の
download_pathが階層になっているとエラーになるということがわかりました。

なのでdownload_pathを単にdownload_path = "tmp/test.jpg" にすれば問題が解決しました、ありがとうございましたm(_ _)m

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/28 11:50

    本当ですね。これは知らなかったな。
    http://stackoverflow.com/questions/39569718/io-error-in-boto3-download-file

    キャンセル

  • 2017/04/28 16:31

    考える上で大きなヒントになりました、ありがとうございましたm(_ _)m

    キャンセル

0

もしかしたらBOMかな。
ソースをUTF-8のBOMなしで保存してUPしてもらえませんか?
こちらで確認したら動きましたよ。

Runtime: Python 2.7

#lambda_function.py
from __future__ import print_function

import boto3
import json
import urllib

print('Loading function')

s3 = boto3.client('s3')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))
    print(bucket)
    print(key)
    try:
        key = key.split(".")[0] + "." + key.split(".")[1]
        download_path = '/tmp/{}'.format(key)
        print(key)
        print(download_path)
    except Exception as e:
        print(e)
        print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
        raise e
{
  "Records": [
    {
      "eventVersion": "2.0",
      "eventTime": "1970-01-01T00:00:00.000Z",
      "requestParameters": {
        "sourceIPAddress": "127.0.0.1"
      },
      "s3": {
        "configurationId": "testConfigRule",
        "object": {
          "eTag": "0123456789abcdef0123456789abcdef",
          "sequencer": "0A1B2C3D4E5F678901",
          "key": "/media/hoge/hoge/test.jpg.dAAAfd01",
          "size": 1024
        },
        "bucket": {
          "arn": "arn:aws:s3:::_____YOUR_BUCKET_____",
          "name": "_____YOUR_BUCKET_____",
          "ownerIdentity": {
            "principalId": "EXAMPLE"
          }
        },
        "s3SchemaVersion": "1.0"
      },
      "responseElements": {
        "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH",
        "x-amz-request-id": "EXAMPLE123456789"
      },
      "awsRegion": "_____YOUR_REGION_____",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "EXAMPLE"
      },
      "eventSource": "aws:s3"
    }
  ]
}
#result
 /media/hoge/hoge/test.jpg.dAAAfd01
 /media/hoge/hoge/test.jpg
 /tmp//media/hoge/hoge/test.jpg     #BUG: Error here.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/27 19:25

    アドバイスありがとうございます!今から試してみます!!m(_ _)m

    キャンセル

  • 2017/04/27 19:52

    何回かトライしたのですが、splitが動いてない状況ですが、今バイナリエディタでBOMが本当に取れているか確認しようとしています。ありがとうございますm(_ _)m

    キャンセル

  • 2017/04/27 20:16

    何度かトライしたのですが、splitがまだ機能していないようです・・・ヒントいただけて大変ありがたく思っています。m(_ _ )m 引き続き調べてみます^^

    キャンセル

  • 2017/04/27 20:17

    BOMは取れていることは確認できたのですが・・・

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    10254questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • AWS(Amazon Web Services)

    2321questions

    Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

  • Python 2.7

    1385questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • トップ
  • Pythonに関する質問
  • s3にアップロードした画像を、boto3でkeyを取得すると、謎の文字列がくっついてきてしまいます・・・