Amazon Location Service용 Amazon Aurora PostgreSQL 사용자 정의 함수 - Amazon Location Service

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

Amazon Location Service용 Amazon Aurora PostgreSQL 사용자 정의 함수

Amazon Location Service를 사용하면 데이터베이스 테이블에 저장된 좌표와 주소를 사용하여 지리 공간 데이터를 정리하고 강화할 수 있습니다.

예:

  • 지오코딩을 사용하여 주소를 좌표로 변환하여 데이터베이스 테이블에 저장된 주소의 데이터 공백을 정규화하고 간격을 메울 수 있습니다.

  • 주소를 지오코딩하여 위치를 확보하고, 지정된 영역에 행을 표시하는 함수와 같은 데이터베이스 공간 함수와 함께 좌표를 사용할 수 있습니다.

  • 보강된 데이터를 사용하여 자동 보고를 생성할 수 있습니다. 예를 들어 지정된 리전의 모든 디바이스를 설명하는 자동 보고서를 생성하거나 위치 업데이트를 전송할 때 고장률이 높은 리전을 설명하는 기계 학습용 자동 보고서를 생성할 수 있습니다.

이 튜토리얼에서는 Amazon Location Service를 사용하여 Amazon Aurora PostgreSQL 데이터베이스 테이블에 저장된 주소를 포맷하고 강화하는 방법을 보여줍니다.

  • Amazon Aurora PostgreSQL – MySQL 및 PostgreSQL과 호환되는 종합 관리형 관계형 데이터베이스 엔진으로, 기존 애플리케이션을 거의 변경하지 않고도 MySQL의 처리량을 최대 5배, PostgreSQL의 처리량을 최대 3배 출력합니다. 자세한 내용은 Amazon Aurora 사용 설명서Amazon Aurora란 무엇인가요?를 참조하세요.

중요

이 튜토리얼의 결과 애플리케이션은 지오코딩 결과를 저장하는 장소 색인을 사용합니다. 지오코딩 결과 저장에 적용되는 요금에 대한 자세한 내용은 Amazon Location Service 요금을 참조하세요.

샘플 코드는 AWS CloudFormation템플릿이 포함된 Amazon Location Service 샘플 리포지토리에서 사용할 수 있습니다. GitHub

개요

AWS 클라우드 diagram showing Amazon Aurora, AWS Lambda, and Amazon Location Service interconnected.

아키텍처에는 다음과 같은 통합이 포함됩니다.

  • 이 솔루션은 Amazon Location 장소 색인 리소스를 사용하여 SearchPlaceIndexForText 작업을 사용한 지오코딩 쿼리를 지원합니다.

  • AWS Lambda는 IAM 정책에서 AWS Lambda가 Amazon Location 지오코딩 작업인 SearchPlaceIndexForText을 호출할 수 있도록 권한을 부여할 때 주소를 지오코딩하는 Python Lambda를 사용합니다.

  • SQL 사용자 정의 함수를 사용하여 지오코딩 Lambda 함수를 호출하는 권한을 Amazon Aurora PostgreSQL에 부여합니다.

사전 조건

시작하려면 다음 사전 요구 사항이 필요합니다.

  • Amazon Aurora PostgreSQL 클러스터. 자세한 내용을 알아보려면 Amazon Aurora 사용 설명서Amazon Aurora DB 클러스터 생성을 참조하세요.

    참고

    Amazon Aurora 클러스터를 공개적으로 사용할 수 없는 경우, AWS 계정의 Virtual Private Cloud(VPC)에서 AWS Lambda에 연결하도록 Amazon Aurora도 구성해야 합니다. 자세한 설명은 Amazon Aurora PostgreSQL 액세스 권한을 AWS Lambda에 부여 섹션을 참조하세요.

  • Amazon Aurora PostgreSQL 클러스터에 연결하기 위한 SQL 개발자 도구.

빠른 시작

이 튜토리얼의 단계를 수행하는 대신 빠른 스택을 실행하여 Amazon Location 작업 SearchPlaceIndexForText을 지원하는 AWS Lambda 함수를 배포할 수 있습니다. 그러면 Amazon Aurora가 AWS Lambda를 호출할 수 있도록 AWS 계정이 자동으로 구성됩니다.

AWS 계정을 구성한 후에는 다음을 수행해야 합니다.

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

장소 색인 리소스 만들기

먼저 지오코딩 쿼리를 지원하는 장소 색인 리소스를 만드는 것부터 시작합니다.

  1. https://console.aws.amazon.com/location/에서 Amazon Location Service 콘솔을 엽니다.

  2. 왼쪽 탐색 창에서 장소 색인을 선택합니다.

  3. 다음 입력란을 작성합니다.

    • 이름 – 장소 색인 리소스의 이름을 입력합니다. 예를 들면 다음과 같습니다 AuroraPlaceIndex. 최대 100자입니다. 유효한 항목에는 영숫자 문자, 하이픈, 마침표 및 밑줄이 포함됩니다.

    • 설명 – 선택적 설명을 입력합니다. 예를 들어, Place index for Amazon Aurora가 있습니다.

  4. 데이터 공급자에서 장소 색인 리소스와 함께 사용할 데이터 공급자를 선택합니다. 선호하는 항목이 없는 경우, Esri로 시작하는 것이 좋습니다.

  5. 데이터 스토리지 옵션에서 예, 결과가 저장됩니다를 지정합니다. 이는 지오코딩 결과를 데이터베이스에 저장하려는 것임을 나타냅니다.

  6. (선택 사항) 태그 아래에 태그 을 입력합니다. 그러면 새 장소 색인 리소스에 태그가 추가됩니다. 자세한 내용을 알아보려면 리소스 태그 지정을 참조하세요.

  7. 장소 색인 생성을 선택합니다.

지오코딩을 위한 AWS Lambda 함수 생성

Amazon Aurora PostgreSQL과 Amazon Location Service 간에 연결을 생성하려면 데이터베이스 엔진의 요청을 처리하는 AWS Lambda 함수가 필요합니다. 이 함수는 Lambda 사용자 정의 함수 이벤트를 변환하고 Amazon Location 작업 SearchPlaceIndexForText을 호출합니다.

AWS Lambda 콘솔, AWS Command Line Interface 또는 AWS Lambda API를 사용하여 함수를 생성할 수 있습니다.

콘솔을 사용하여 Lambda 사용자 정의 함수를 생성하려면

  1. https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 왼쪽 탐색에서 함수를 선택합니다.

  3. 함수 생성을 선택하고 새로 작성이 선택되어 있는지 확인합니다.

  4. 다음 입력란을 작성합니다.

    • 함수 이름 – 함수에 고유한 이름을 입력합니다. 유효한 항목에는 공백 없는 영숫자 문자, 하이픈 및 밑줄이 포함됩니다. 예를 들어, AuroraGeocoder.

    • 런타임Python 3.8을 선택합니다.

  5. 함수 생성을 선택합니다.

  6. Code 탭을 선택하여 편집기를 엽니다.

  7. lambda_function.py의 자리 표시자 코드를 다음과 같이 덮어씁니다.

    from os import environ import boto3 from botocore.config import Config # load the place index name from the environment, falling back to a default PLACE_INDEX_NAME = environ.get("PLACE_INDEX_NAME", "AuroraPlaceIndex") location = boto3.client("location", config=Config(user_agent="Amazon Aurora PostgreSQL")) """ This Lambda function receives a payload from Amazon Aurora and translates it to an Amazon Location `SearchPlaceIndex` call and returns the results as-is, to be post-processed by a PL/pgSQL function. """ def lambda_handler(event, context): kwargs = {} if event.get("biasPosition") is not None: kwargs["BiasPosition"] = event["biasPosition"] if event.get("filterBBox") is not None: kwargs["FilterBBox"] = event["filterBBox"] if event.get("filterCountries") is not None: kwargs["FilterCountries"] = event["filterCountries"] if event.get("maxResults") is not None: kwargs["MaxResults"] = event["maxResults"] return location.search_place_index_for_text( IndexName=PLACE_INDEX_NAME, Text=event["text"], **kwargs)["Results"]
  8. 장소 색인의 이름을 다른 이름으로 지정한 경우 AuroraPlaceIndex, 리소스 이름을 PLACE_INDEX_NAME 지정할 환경 변수를 생성하세요.

    • 구성 탭에서 환경 변수를 선택합니다.

    • 편집을 선택한 다음 환경 변수 추가를 선택합니다.

    • PLACE_INDEX_NAME를 입력합니다.

    • 에 장소 색인 리소스의 이름을 입력합니다.

  9. [배포]를 선택하여 업데이트된 함수를 저장합니다.

  10. 테스트 드롭다운 메뉴에서 테스트 이벤트 구성을 선택합니다.

  11. 새로운 테스트 이벤트 생성을 선택하세요.

  12. 다음 테스트 이벤트를 입력합니다.

    { "text": "Baker Beach", "biasPosition": [-122.483, 37.790], "filterCountries": ["USA"] }
  13. Lambda 함수를 테스트하려면 테스트를 선택합니다.

  14. 구성 탭을 선택합니다.

  15. 일반 구성에서 권한을 선택합니다.

  16. 실행 역할에서 하이퍼링크된 역할 이름을 선택하여 Lambda 함수에 Amazon Location Service 권한을 부여합니다.

  17. 권한 탭에서 권한 추가 드롭 다운을 선택한 다음, 인라인 정책 생성을 선택합니다.

  18. JSON 탭을 선택합니다.

  19. 다음 IAM 정책을 추가합니다.

    • 다음 정책은 장소 색인 SearchPlaceIndexForText 리소스에 보낼 수 있는 권한을 AuroraPlaceIndex부여합니다.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "geo:SearchPlaceIndexForText", "Resource": "arn:aws:geo:<Region>:<AccountId>:place-index/AuroraPlaceIndex" } ] }
  20. 정책 검토를 선택합니다.

  21. 정책 이름을 입력합니다. 예를 들어, AuroraPlaceIndexReadOnly.

  22. 정책 생성을 선택합니다.

Amazon Aurora PostgreSQL 액세스 권한을 AWS Lambda에 부여

Amazon Aurora PostgreSQL이 AWS Lambda 함수를 호출하려면 먼저 액세스 권한을 부여해야 합니다.

Amazon Aurora PostgreSQL 클러스터에 공개적으로 액세스할 수 없는 경우, Amazon Aurora가 Lambda 함수를 호출하도록 하려면 먼저 AWS Lambda에 대한 VPC 엔드포인트를 생성해야 합니다.

AWS Lambda에 대한 VPC 엔드포인트 생성

참고

이 단계는 Amazon Aurora PostgreSQL 클러스터에 공개적으로 액세스할 수 없는 경우에만 필요합니다.

  1. Amazon Virtual Private Cloud Console을 엽니다.

  2. 왼쪽 탐색에서 엔드포인트를 선택합니다.

  3. Create endpoint(엔드포인트 생성)을 선택합니다.

  4. 서비스 이름 필터에 “lambda”를 입력한 다음 com.amazonaws.<region>.lambda를 선택합니다.

  5. Aurora 클러스터를 포함하는 VPC를 선택합니다.

  6. 각 가용 영역마다 서브넷을 하나씩 선택합니다.

  7. 보안 그룹 필터에서 “default” 또는 Aurora 클러스터가 속한 보안 그룹의 이름을 입력한 다음 보안 그룹을 선택합니다.

  8. Create endpoint(엔드포인트 생성)을 선택합니다.

AWS Lambda 함수 호출 권한을 부여하는 IAM 정책을 생성합니다.

  1. IAM 콘솔(IAM console)을 엽니다.

  2. 왼쪽 탐색에서 액세스 관리를 확장하여 정책을 선택합니다.

  3. 정책 생성을 선택합니다.

  4. JSON 탭에 다음 정책을 입력합니다.

    • 다음은 AuroraGeocoder AWS Lambda 함수를 호출하는 Amazon Aurora PostgreSQL 권한을 제공하는 IAM 정책의 예제입니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": [ "arn:aws:lambda:<Region>:<AccountId>:function:AuroraGeocoder" ] } ] }
  5. (선택 사항) 다음: 태그를 선택하여 선택적 태그를 추가합니다.

  6. 다음: 검토를 선택합니다.

  7. 정책을 검토하고 정책에 대한 다음 세부 정보를 입력합니다.

    • 이름 - 영숫자와 '+=, .@-_' 문자를 사용합니다. 최대 128자입니다. 예를 들어, AuroraGeocoderInvoke.

    • 설명 – 선택적 설명을 입력합니다. 영숫자와 '+=, .@-_' 문자를 사용합니다. 최대 1000자입니다.

  8. 정책 생성을 선택합니다. 정책을 IAM 역할에 연결하는 데 사용하는 이 정책의 ARN을 기록해 두십시오.

IAM 역할을 생성하여 Amazon Relational Database Service (RDS)에 권한을 부여하기

IAM 역할을 생성하면 Amazon Aurora PostgreSQL이 사용자 대신 Lambda 함수에 액세스하는 역할을 맡을 수 있습니다. 자세한 내용은 IAM 사용 설명서IAM 사용자에게 권한을 위임하기 위한 역할 생성을 참조하십시오.

다음 예제는 다음과 같은 역할을 생성하는 AWS CLI 명령입니다 AuroraGeocoderInvokeRole.

aws iam create-role --role-name rds-lambda-role --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'

IAM 정책을 IAM 역할에 연결합니다.

IAM 역할이 있는 경우 생성한 IAM 정책을 연결합니다.

다음 예제는 정책을 AuroraGeocoderInvoke역할에 AuroraGeocoderInvokeRole연결하는 AWS CLI 명령입니다.

aws iam attach-role-policy --policy-arn AuroraGeocoderInvoke --role-name AuroraGeocoderInvokeRole

IAM 역할을 Amazon Aurora DB 클러스터에 추가

다음 예제는 라는 Amazon Aurora PostgreSQL DB 클러스터에 IAM 역할을 추가하는 AWS CLI 명령입니다. MyAuroraCluster

aws rds add-role-to-db-cluster \ --db-cluster-identifier MyAuroraCluster \ --feature-name Lambda \ --role-arn AuroraGeocoderInvokeRole \ --region your-region

AWS Lambda 함수 호출

지오코딩 Lambda 함수를 호출할 권한을 Amazon Aurora PostgreSQL에 부여한 후에는 지오코딩 AWS Lambda 함수를 호출하는 Amazon Aurora PostgreSQL 사용자 정의 함수를 생성할 수 있습니다. 자세한 내용은 Amazon Aurora 사용 설명서의 Amazon Aurora PostgreSQL DB 클러스터에서 AWS Lambda 함수 호출을 참조하십시오.

필요한 PostgreSQL 확장을 설치합니다.

필수 PostgreSQL 확장 aws_lambdaaws _commons 확장을 설치하려면 Amazon Aurora 사용 설명서Lambda 함수 사용에 대한 개요를 참조하세요.

CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;

필요한 PostGIS 확장을 설치합니다.

PostGIS는 공간 정보를 저장하고 관리하기 위해 PostgreSQL을 확장한 것입니다. 자세한 내용은 Amazon 관계형 데이터베이스 서비스 사용 설명서PostGIS 확장 작업을 참조하세요.

CREATE EXTENSION IF NOT EXISTS postgis;

Lambda 함수를 호출하는 SQL 사용자 정의 함수 생성

SQL 편집기에서 새 사용자 정의 함수를 f_SearchPlaceIndexForText 생성하여 함수를 호출합니다. AuroraGeocoder

CREATE OR REPLACE FUNCTION f_SearchPlaceIndexForText( text text, bias_position geometry(Point, 4326) DEFAULT NULL, filter_bbox box2d DEFAULT NULL, filter_countries text[] DEFAULT NULL, max_results int DEFAULT 1 ) RETURNS TABLE ( label text, address_number text, street text, municipality text, postal_code text, sub_region text, region text, country text, geom geometry(Point, 4326) ) LANGUAGE plpgsql IMMUTABLE AS $function$ begin RETURN QUERY WITH results AS ( SELECT json_array_elements(payload) rsp FROM aws_lambda.invoke( aws_commons.create_lambda_function_arn('AuroraGeocoder'), json_build_object( 'text', text, 'biasPosition', CASE WHEN bias_position IS NOT NULL THEN array_to_json(ARRAY[ST_X(bias_position), ST_Y(bias_position)]) END, 'filterBBox', CASE WHEN filter_bbox IS NOT NULL THEN array_to_json(ARRAY[ST_XMin(filter_bbox), ST_YMin(filter_bbox), ST_XMax(filter_bbox), ST_YMax(filter_bbox)]) END, 'filterCountries', filter_countries, 'maxResults', max_results ) ) ) SELECT rsp->'Place'->>'Label' AS label, rsp->'Place'->>'AddressNumber' AS address_number, rsp->'Place'->>'Street' AS street, rsp->'Place'->>'Municipality' AS municipality, rsp->'Place'->>'PostalCode' AS postal_code, rsp->'Place'->>'SubRegion' AS sub_region, rsp->'Place'->>'Region' AS region, rsp->'Place'->>'Country' AS country, ST_GeomFromGeoJSON( json_build_object( 'type', 'Point', 'coordinates', rsp->'Place'->'Geometry'->'Point' ) ) geom FROM results; end; $function$;

SQL 함수를 호출하여 Aurora에서 지오코딩하기

SQL 문을 실행하면 Lambda AuroraGeocoder함수가 호출됩니다. 이 함수는 데이터베이스의 데이터베이스 테이블에서 주소 레코드를 가져와 장소 인덱스 Amazon Aurora PostgreSQL 리소스를 사용하여 지오코딩합니다.

참고

Amazon Aurora PostgreSQL은 SQL 사용자 정의 함수를 호출할 때마다 Lambda 함수를 호출합니다.

50개 행을 지오코딩하는 경우 Amazon Aurora PostgreSQL은 Lambda 함수를 50번 호출합니다. 각 행마다 한 번 호출합니다.

다음 f_SearchPlaceIndexForText SQL 함수는 AuroraGeocoderLambda 함수를 통해 아마존 로케이션의 SearchPlaceIndexForText API에 요청을 보냅니다. 이 함수는 ST_AsText(geom)가 텍스트로 변환되는 PostGIS 지오메트리인 geom 열을 반환합니다.

SELECT *, ST_AsText(geom) FROM f_SearchPlaceIndexForText('Vancouver, BC');

기본적으로 반환에는 하나의 행이 포함됩니다. MaxResults 한도까지 추가 행을 요청하려면 BiasPosition을 제공하고 결과를 캐나다로 제한하면서 다음 SQL 문을 실행하세요.

SELECT * FROM f_SearchPlaceIndexForText('Mount Pleasant', ST_MakePoint(-123.113, 49.260), null, '{"CAN"}', 5);

경계 상자를 사용하여 결과를 필터링하려면 Box2Dfilter_bbox로 전달합니다.

  • FilterBBox – 경계 상자 내의 위치를 반환하여 결과를 필터링합니다. 이는 선택 가능한 파라미터입니다.

SELECT * FROM f_SearchPlaceIndexForText('Mount Pleasant', null, 'BOX(-139.06 48.30, -114.03 60.00)'::box2d, '{"CAN"}', 5);

PostGIS 유형과 함수에 대한 자세한 내용은 PostGIS 참조를 참조하세요.

주소 데이터를 포함하는 데이터베이스 강화

다음 데이터가 다음 열로 구분된 데이터베이스 테이블이 주어지면 Amazon Location 작업 SearchPlaceIndexForText을 사용하여 형식화된 주소를 생성하는 동시에 정규화 및 지오코딩 수행할 수 있습니다.

  • id

  • address

  • city

  • state

  • zip

WITH source_data AS ( SELECT id, address || ', ' || city || ', ' || state || ', ' || zip AS formatted_address FROM addresses ), geocoded_data AS ( SELECT *, (f_SearchPlaceIndexForText(formatted_address)).* FROM source_data ) SELECT id, formatted_address, label normalized_address, ST_Y(geom) latitude, ST_X(geom) longitude FROM geocoded_data -- limit the number of rows that will be geocoded; remove this to geocode the entire table LIMIT 1;

다음 예시는 결과 데이터테이블 행 하나를 보여줍니다.

id | formatted_address | normalized_address | latitude | longitude ----+--------------------------------+--------------------------------------------+------------------+------------------- 42 | 123 Anytown Ave N, Seattle, WA | 123 Anytown Ave N, Seattle, WA, 12345, USA | 47.6223000127926 | -122.336745971039 (1 row)

데이터베이스 테이블 업데이트 및 열 채우기

다음 예시에서는 테이블을 업데이트하고 SearchPlaceIndexForText 쿼리의 결과로 열을 채웁니다.

WITH source_data AS ( -- select rows that have not been geocoded and created a formatted address for each SELECT id, address || ', ' || city || ', ' || state || ', ' || zip AS formatted_address FROM addresses WHERE label IS NULL -- limit the number of rows that will be geocoded; remove this to geocode the entire table LIMIT 1 ), geocoded_data AS ( -- geocode each row and keep it linked to the source's ID SELECT id, (f_SearchPlaceIndexForText(formatted_address)).* FROM source_data ) UPDATE addresses -- populate columns SET normalized_address = geocoded_data.label, latitude = ST_Y(geocoded_data.geom), longitude = ST_X(geocoded_data.geom) FROM geocoded_data -- ensure that rows match WHERE addresses.id = geocoded_data.id;

다음 단계

샘플 코드는 AWS CloudFormation템플릿이 포함된 Amazon Location Service 샘플 리포지토리에서 사용할 수 있습니다. GitHub