web-dev-qa-db-ja.com

AWS:JSONでオブジェクトキー名のスペースを「+」記号で置き換えるS3イベントを修正する方法

バケット「A」からバケット「B」にオブジェクトをコピーするlamba関数があります。「New Text Document.txt」という名前のオブジェクトが、ビルドされるjsonであるバケット「A」に作成されるまで、すべてが正常に機能していましたS3イベントでは、 "key"のキー: "New + Text + Document.txt"。

スペースは「+」に置き換えられました。私はそれがウェブで検索することによる既知の問題であることを知っています。しかし、これを修正する方法がわかりません。着信json自体に「+」があり、「+」は実際にはファイルの名前に含めることができます。 「New + Text Document.txt」のように。

したがって、ラムダ関数で盲目的に '+'を ''で区切るロジックを持つことはできません。

この問題が原因で、コードがバケット内のファイルを見つけようとすると、ファイルを見つけることができません。

提案してください。

18
ViS

これを修正するために私がしたことは

Java.net.URLDecoder.decode(b.getS3().getObject().getKey(), "UTF-8")


{
    "Records": [
        {
            "s3": {
                "object": {
                    "key": "New+Text+Document.txt"
                }
            }
        }
    ]
}

そのため、JSon値 "New + Text + Document.txt"は正しくNew Text Document.txtに変換されます。

これで問題が解決しました。これが非常に正しい解決策であるかどうかを提案してください。私の実装を破壊する可能性のあるコーナーケースはありますか?.

7
ViS

python)で記述されたラムダの解決策を探してこれに遭遇しました; "urllib.parse.unquote_plus"は私のために機能し、スペースと+記号の両方を持つファイルを適切に処理しました:

from urllib.parse import unquote_plus
import boto3


bucket = 'testBucket1234'
# uploaded file with name 'foo + bar.txt' for test, s3 Put event passes following encoded object_key
object_key = 'foo %2B bar.txt'
print(object_key)
object_key = unquote_plus(object_key)
print(object_key)

client = boto3.client('s3')
client.get_object(Bucket=bucket, Key=object_key)
14
kinzleb

スコットに同意する。私にとってオブジェクト作成イベントはセミコロンに%3を追加していました:正しいs3 urlを取得するには2回置換する必要があります

python

def lambda_handler(event, context):
logger.info('Event: %s' % json.dumps(event))
source_bucket = event['Records'][0]['s3']['bucket']['name']
key_old = event['Records'][0]['s3']['object']['key']
key_new = key_old.replace('%3',':')
key = key_new.replace(':A',':')
logger.info('key value')
logger.info(key)
0
Hitesh

私はあなたが使うべきだと思います:

getS3().getObject().getUrlDecodedKey()

代わりに、デコードされたキーを返すメソッド

getS3().getObject().getKey()
0
MeetJoeBlack