Amazon Translate Translate에서 서명 버전 4 사용 - Amazon Translate

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Translate Translate에서 서명 버전 4 사용

이 예제 Python 프로그램은 서명 버전 4를 사용하여 Amazon Translate 요청에 인증 정보를 추가하는 방법을 보여 줍니다. 이 예제는 POST 요청을 생성하고, 요청 본문(페이로드)에 번역할 텍스트를 포함하는 JSON 구조를 만들고, Authorization 헤더의 인증 정보를 전달합니다. 서명 버전 4 사용에 대한 자세한 내용은 단원을 참조하십시오.서명 버전 4 서명 프로세스Amazon Web Services 일반 참조.

설정

예제를 실행하려면 다음 단계를 수행합니다.

  1. AWS Command Line Interface(AWS CLI)를 설치합니다. AWS SDK for Python (Boto)은 AWS CLI를 설치할 때 포함됩니다. 지침은 2단계: 설정AWS Command Line Interface(AWS CLI) 섹션을 참조하세요.

  2. 생성AWS Identity and Access Management(IAM) 는 이 예제를 실행하는 데 필요한 최소한의 권한 정책을 갖는 사용자입니다. IAM 사용자 생성에 대한 자세한 내용은 단원을 참조하십시오.AWS 계정에서 IAM 사용자 생성AWS Identity and Access Management사용 설명서. 필요한 권한 정책의 경우 Amazon Translate 자격 증명 기반 정책을 참조하십시오. 사용자 액세스 키 ID와 보안 액세스 키를 기록합니다.

  3. AWS_ACCESS_KEY and AWS_SECRET_ACCESS_KEY라는 환경 변수에 액세스 키 ID와 보안 액세스 키를 각각 넣습니다. 자격 증명을 코드에 포함하지 않는 것이 가장 좋은 방법입니다.

  4. 컴퓨터에 새 파일을 만들고 예제용 코드(다음 단원 참조)를 복사하여 파일에 붙여 넣은 후 .py 확장명으로 파일을 저장합니다.

  5. 코드에서 바꾸기regionAmazon Translate Translate를 실행하려는 AWS 리전 이름으로TranslateText작업. 지원되는 리전 목록은 단원을 참조하십시오.AWS 리전 및 엔드포인트AWS일반 참조.

코드

다음은 예제 Python 프로그램의 전체 코드입니다.

엔드포인트 URL 및 요청 본문과 같은 요청 값을 생성한 후 이 코드는 다음을 수행합니다.

  1. Amazon Translate Translate에 대한 정식 요청을 생성합니다.TranslateText작업.

  2. 서명을 생성하기 해시를 생성하려는 문자열을 생성합니다.

  3. 서명을 계산합니다.

  4. 요청 헤더에 서명을 추가합니다.

  5. TranslateText 작업에 요청을 전송합니다.

컴퓨터에서 예제를 실행하려면 Python 파일로 코드를 복사합니다.

# AWS Version 4 signing example # Translate API (TranslateText) # For more information about using Signature Version 4, see http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html. # This example makes a POST request to Amazon Translate and # passes the text to translate JSON in the body (payload) # of the request. Authentication information is passed in an # Authorization header. import sys, os, base64, datetime, hashlib, hmac import requests # pip install requests # ************* REQUEST VALUES ************* method = 'POST' service = 'translate' region = 'region' host = service + '.' + region + '.amazonaws.com' endpoint = 'https://' + host + '/' # POST requests use a content type header. For Amazon Translate, # the content is JSON. content_type = 'application/x-amz-json-1.1' # Amazon Translate requires an x-amz-target header that has this format: # AWSShineFrontendService_20170701.<operationName>. amz_target = 'AWSShineFrontendService_20170701.TranslateText' # Pass request parameters for the TranslateText operation in a JSON block. request_parameters = '{' request_parameters += '"Text": "Hello world.",' request_parameters += '"SourceLanguageCode": "en",' request_parameters += '"TargetLanguageCode": "de"' request_parameters += '}' # The following functions derive keys for the request. For more information, see # http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python. def sign(key, msg): return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() def getSignatureKey(key, date_stamp, regionName, serviceName): kDate = sign(('AWS4' + key).encode('utf-8'), date_stamp) kRegion = sign(kDate, regionName) kService = sign(kRegion, serviceName) kSigning = sign(kService, 'aws4_request') return kSigning # Python can read the AWS access key from environment variables or the configuration file. # In this example, keys are stored in environment variables. As a best practice, do not # embed credentials in code. access_key = os.environ.get('AWS_ACCESS_KEY_ID') secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY') if access_key is None or secret_key is None: print 'No access key is available.' sys.exit() # Create a timestamp for headers and the credential string. t = datetime.datetime.utcnow() amz_date = t.strftime('%Y%m%dT%H%M%SZ') date_stamp = t.strftime('%Y%m%d') # The date without time is used in the credential scope. # ************* TASK 1: CREATE A CANONICAL REQUEST ************* # For information about creating a canonical request, see http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html. # Step 1: Define the verb (GET, POST, etc.), which you have already done. # Step 2: Create a canonical URI. A canonical URI is the part of the URI from domain to query. # string (use '/' if no path) canonical_uri = '/' ## Step 3: Create the canonical query string. In this example, request # parameters are passed in the body of the request and the query string # is blank. canonical_querystring = '' # Step 4: Create the canonical headers. Header names must be trimmed, # lowercase, and sorted in code point order from low to high. # Note the trailing \n. canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + '\n' + 'x-amz-date:' + amz_date + '\n' + 'x-amz-target:' + amz_target + '\n' # Step 5: Create the list of signed headers by listing the headers # in the canonical_headers list, delimited with ";" and in alphabetical order. # Note: The request can include any headers. Canonical_headers and # signed_headers should contain headers to include in the hash of the # request. "Host" and "x-amz-date" headers are always required. # For Amazon Translate, content-type and x-amz-target are also required. signed_headers = 'content-type;host;x-amz-date;x-amz-target' # Step 6: Create the payload hash. In this example, the request_parameters # variable contains the JSON request parameters. payload_hash = hashlib.sha256(request_parameters).hexdigest() # Step 7: Combine the elements to create a canonical request. canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash # ************* TASK 2: CREATE THE STRING TO SIGN************* # Set the algorithm variable to match the hashing algorithm that you use, either SHA-256 (recommended) or SHA-1. # algorithm = 'AWS4-HMAC-SHA256' credential_scope = date_stamp + '/' + region + '/' + service + '/' + 'aws4_request' string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request).hexdigest() # ************* TASK 3: CALCULATE THE SIGNATURE ************* # Create the signing key using the getSignaturKey function defined above. signing_key = getSignatureKey(secret_key, date_stamp, region, service) # Sign the string_to_sign using the signing_key. signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest() # ************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST ************* # Put the signature information in a header named Authorization. authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature # For Amazon Translate, the request can include any headers, but it must include "host," "x-amz-date," # "x-amz-target," "content-type," and "Authorization" headers. Except for the authorization # header, the headers must be included in the canonical_headers and signed_headers values, as # noted earlier. Header order is not significant. # Note: The Python 'requests' library automatically adds the 'host' header. headers = {'Content-Type':content_type, 'X-Amz-Date':amz_date, 'X-Amz-Target':amz_target, 'Authorization':authorization_header} # ************* TASK 5: SEND THE REQUEST ************* print 'Request:\n\t' + request_parameters response = requests.post(endpoint, data=request_parameters, headers=headers) print 'Response:\n\t' + response.text