programing

AWS: space를 json에서 '+' 서명 개체 키 이름으로 바꾸는 S3 이벤트 수정 방법

lastmemo 2023. 3. 22. 20:37
반응형

AWS: space를 json에서 '+' 서명 개체 키 이름으로 바꾸는 S3 이벤트 수정 방법

버킷 'A'에서 버킷 'B'로 오브젝트를 복사하는 lamba 기능이 있는데, 'New Text Document'라는 이름의 오브젝트까지 모든 것이 정상적으로 동작했습니다.txt'는 S3 이벤트에 내장된 json인 버킷 'A'에 생성되었으며, 키는 "key"로 "New+Text+Document.txt"입니다.

공백이 '+'로 대체되었습니다.웹 검색을 통해 이미 알려진 문제임을 알고 있습니다.그러나 이 문제를 어떻게 해결해야 할지 잘 모르겠고, 착신 json 자체에는 '+'와 '+'가 파일 이름에 있을 수 있습니다.예를 들어 'New+Text Document.txt'와 같이 입력합니다.

그래서 나는 람다 함수의 '+'를 '+'로 띄우는 논리를 맹목적으로 가질 수 없다.

이 문제로 인해 코드가 버킷 내의 파일을 검색하려고 하면 찾을 수 없습니다.

제안해 주세요.

java 대신 python으로 작성된 lamda 솔루션을 찾다가 우연히 알게 되었습니다. "urlib.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)

NodeJS, Javascript 또는 Typescript

여기에서는 다른 런타임에 대해 공유하기 때문에 노드에서의 방법은 다음과 같습니다.JS:

const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

여기 AWS docs에서 나왔기 때문에 이것은 공식적인 해결책이라고 말할 수 있습니다.

이 문제를 해결하기 위해 제가 한 일은

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


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

따라서 JSon 값인 "New+Text+Document.txt"가 새 텍스트 문서로 변환됩니다.txt, 정확합니다.

이것으로 문제가 해결되었습니다.이것이 매우 올바른 해결책인지 제안해 주세요.나의 구현을 방해할 수 있는 궁지에 몰린 사례가 있습니까?

자바에서는 다음을 사용해야 한다고 생각합니다.

getS3().getObject().getUrlDecodedKey()

디코딩된 키를 반환하는 메서드

getS3().getObject().getKey()

에는 UrlDecode가 있습니다.샘플은 아래와 같습니다.

HttpUtility.UrlDecode(s3entity.Object.Key, Encoding.UTF8)

AWS S3 이벤트가 Url Encoding과 같은 특수문자를 대체하는 것과 같은 문제에 직면했습니다.이 문제를 해결하기 위해 API "SdkHttpUtils.urlDecode(String key)"를 사용하여 오브젝트 키를 디코딩했습니다.그래서 예상대로 작동했다.

SdkHttpUtils API에 대한 자세한 내용은 아래 링크를 참조하십시오.

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/util/SdkHttpUtils.html#urlDecode-java.lang.String-

Scott의 의견에 동의합니다. create object event가 세미콜론에 %3을 추가하고 있었습니다. 올바른 s3 URL을 얻으려면 두 번 교체해야 합니다.

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)

언급URL : https://stackoverflow.com/questions/44779042/aws-how-to-fix-s3-event-replacing-space-with-sign-in-object-key-names-in-js

반응형