AWS Lambda에서 지원팀에 문의하기 전에(S3 이벤트편)

4001 단어 람다AWSLambdaAWS
AWS Lambda에서는 Lambda 함수에 지정된 이벤트 소스에서 발생한 이벤트에 따라 함수가 Invoke되지만, 이벤트가 발생했을 텐데 함수가 생각한 것처럼 Invoke되지 않는다! 라고 고민할 때가 있을까 생각합니다. 그럴 때 이벤트 소스가 이벤트를 보냈는지 확인하고 싶어지는데 실은 이것은 사용자 측에서는 어렵거나 합니다.

그렇다고 하는 경우는 서포트에 문의해 조사를 받게 되는 것입니다만 이벤트 소스가 S3의 경우에 서포트에 문의하는데 있어서 최소한 필요한 것이 2 종류의 리퀘스트 ID입니다. 주의해야 하는 것은 이들은 통상의 액세스 로그 등에는 기록되어 있지 않기 때문에 유저측에서 취득·기록할 필요가 있다는 것입니다. 또한 상황에 따라 필요한 정보는 다르기 때문에 이러한 것만으로 반드시 원인을 특정 가능하다는 것은 아님을 전해 둡니다. 적어도 S3측에서 이벤트 통지의 발생 유무의 조사에는 적어도 이 2 종류의 리퀘스트 ID가 필요하다고 하는 것입니다.

자세한 것은 문서 에도 기재가 있으므로 그쪽을 참조 받는 것으로, 여기에서는 간단하게 요점만 정리합니다.

필요한 것은 x-amz-request-id와 x-amz-id-2라는 두 개의 요청 ID입니다. 그리고 이것들은 이벤트의 발생원이 되는 오브젝트 조작 요구에 대한 응답으로서만 취득 가능합니다. 따라서 이들을 S3의 오브젝트 조작 요구를 발행하는 측에서 취득한 후에 어떠한 수단으로 기록해 둘 필요가 있습니다. 방법으로는 클라이언트 측에서 로그 파일에 기록하는 방법도 있고, 모바일 등의 경우, 로깅용 API 등을 준비하고 별도 서버 측에 보내 기록하는 방법도 있습니다.

실제로이 요청 ID의 값을 확인하는 방법에는 여러 가지가 있지만 쉽게 시도 할 수 있도록 브라우저에서 S3에 요청할 때 오류 페이지입니다. 예를 들어 S3에서 정적 웹 사이트 전달 기능을 이용하여 전달하는 경우 브라우저의 주소 표시줄에 존재하지 않는 객체가 포함된 URL을 넣어 표시하면 다음과 같은 응답이 표시됩니다.



여기에 표시된 RequestId와 HostId는 각각 x-amz-request-id와 x-amz-id-2에 해당합니다.
성공적인 요청에서 이 값을 확인하려면 응답 헤더를 확인해야 합니다. 최근의 브라우저라면 개발자 툴 등이 제공되고 있어 확인하는 것이 가능합니다. 예를 들어 Chrome의 경우 "Developer Tools"를 시작한 후 요청하여 해당 요청에 대한 응답 헤더를 확인할 수 있습니다. 다음과 같은 느낌입니다.



이 빨간색 테두리로 둘러싸인 부분이 필요한 요청 ID입니다.

또한 각 언어의 SDK는 로그 출력을 지원합니다. 상세한 설정 방법은 상기 문서나 각 언어의 문서를 참조 받는 것으로, Java의 경우는 개별의 출력도 가능하게 되어 있습니다.
예를 들면 다음과 같이 출력합니다.

DefaultAWSCredentialsProviderChain credentialProviderChain = new DefaultAWSCredentialsProviderChain();
AmazonS3Client client = new AmazonS3Client(credentialProviderChain);
PutObjectRequest req = new PutObjectRequest("sample-bucket", "sample.json", new File("sample.json"));
client.putObject(req);
S3ResponseMetadata md = client.getCachedResponseMetadata(req);
System.out.println("x-amz-request-id: " + md.getRequestId() + " x-amz-id-2: " + md.getHostId());


그리고는 여기에서 취득한 값을 클라이언트 측에서 로컬 파일에 로깅하는 것도 별도 서버 측에 보내 로깅하는 것도 가능하네요.

좋은 웹페이지 즐겨찾기