Amazon Aurora DSQL은 미리보기 서비스로 제공됩니다. 자세한 내용은 AWS 서비스 약관의 베타 및 미리보기
Amazon Aurora DSQL에서 AWS Lambda 사용
다음 자습서에서는 Aurora DSQL에서 Lambda를 사용하는 방법을 설명합니다.
사전 조건
-
Lambda 함수 생성 권한. 자세한 내용은 Getting started with Lambda를 참조하세요.
-
Lambda가 생성한 IAM 정책을 생성하거나 수정할 수 있는 권한.
iam:CreatePolicy
및iam:AttachRolePolicy
에 대한 권한이 필요합니다. 자세한 내용은 Actions, resources, and condition keys for IAM을 참조하세요. -
npm v8.5.3 이상이 설치되어 있어야 합니다.
-
zip v3.0 이상이 설치되어 있어야 합니다.
AWS Lambda에서 새로운 함수 생성
AWS Management Console에 로그인하고 https://console.aws.amazon.com/lambda/
에서 AWS Lambda 콘솔을 엽니다. -
함수 생성을 선택합니다.
-
dsql-sample
과 같은 이름을 입력합니다. -
Lambda가 기본 Lambda 권한으로 새 역할을 생성하도록 기본 설정을 편집하지 마세요.
-
함수 생성을 선택합니다.
Lambda 실행 역할이 클러스터에 연결하도록 권한 부여
-
Lambda 함수에서 구성 > 권한을 선택합니다.
-
역할 이름을 선택하여 IAM 콘솔에서 실행 역할을 엽니다.
-
권한 추가 > 인라인 정책 생성을 선택하고 JSON 편집기를 사용합니다.
-
작업에서 다음 작업을 붙여 넣어 IAM ID가 관리자 데이터베이스 역할을 사용하여 연결하도록 승인합니다.
"Action": ["dsql:DbConnectAdmin"],
참고
시작하기 위한 사전 조건 단계를 최소화하기 위해 관리자 역할을 사용합니다. 프로덕션 애플리케이션에 관리자 데이터베이스 역할을 사용해서는 안 됩니다. 데이터베이스에 대한 최소한의 권한 부여를 사용하여 사용자 지정 데이터베이스 역할을 생성하는 방법은 IAM 역할과 함께 데이터베이스 역할 사용 섹션을 참조하세요.
-
리소스에서 클러스터의 Amazon 리소스 이름(ARN)을 추가합니다. 와일드카드를 사용할 수도 있습니다.
"Resource": ["*"]
-
다음을 선택합니다.
-
정책의 이름을 입력합니다(예:
dsql-sample-dbconnect
). -
정책 생성을 선택합니다.
Lambda에 업로드할 패키지 생성
-
myfunction
이라는 폴더를 생성합니다. -
폴더 안에 다음 내용이 담긴
package.json
이라는 파일을 새로 생성합니다.{ "dependencies": { "@aws-sdk/dsql-signer": "^3.705.0", "assert": "2.1.0", "pg": "^8.13.1" } }
-
폴더 안에서 디렉터리에 다음 내용이 담긴
index.mjs
라는 파일을 생성합니다.import { DsqlSigner } from "@aws-sdk/dsql-signer"; import pg from "pg"; import assert from "node:assert"; const { Client } = pg; async function dsql_sample(clusterEndpoint, region) { let client; try { // The token expiration time is optional, and the default value 900 seconds const signer = new DsqlSigner({ hostname: clusterEndpoint, region, }); const token = await signer.getDbConnectAdminAuthToken(); // <https://node-postgres.com/apis/client> // By default `rejectUnauthorized` is true in TLS options // <https://nodejs.org/api/tls.html#tls_tls_connect_options_callback> // The config does not offer any specific parameter to set sslmode to verify-full // Settings are controlled either via connection string or by setting // rejectUnauthorized to false in ssl options client = new Client({ host: clusterEndpoint, user: "admin", password: token, database: "postgres", port: 5432, // <https://node-postgres.com/announcements> for version 8.0 ssl: true, rejectUnauthorized: false }); // Connect await client.connect(); // Create a new table await client.query(`CREATE TABLE IF NOT EXISTS owner ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(30) NOT NULL, city VARCHAR(80) NOT NULL, telephone VARCHAR(20) )`); // Insert some data await client.query("INSERT INTO owner(name, city, telephone) VALUES($1, $2, $3)", ["John Doe", "Anytown", "555-555-1900"] ); // Check that data is inserted by reading it back const result = await client.query("SELECT id, city FROM owner where name='John Doe'"); assert.deepEqual(result.rows[0].city, "Anytown") assert.notEqual(result.rows[0].id, null) await client.query("DELETE FROM owner where name='John Doe'"); } catch (error) { console.error(error); throw new Error("Failed to connect to the database"); } finally { client?.end(); } Promise.resolve(); } // https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html export const handler = async (event) => { const endpoint = event.endpoint; const region = event.region; const responseCode = await dsql_sample(endpoint, region); const response = { statusCode: responseCode, endpoint: endpoint, }; return response; };
-
다음과 같은 명령을 사용하여 패키지를 생성합니다.
npm install zip -r pkg.zip .
코드 패키지 업로드 및 Lambda 함수 테스트
-
Lambda 함수의 코드 탭에서 에서 업로드 > .zip 파일을 선택합니다.
-
생성한
pkg.zip
을 업로드합니다. 자세한 내용은 .zip 파일 아카이브를 사용하여 Node.js Lambda 함수 배포를 참조하세요. -
Lambda 함수의 테스트 탭에서 다음 JSON 페이로드를 붙여 넣고 클러스터 ID를 사용하도록 수정합니다.
-
Lambda 함수의 테스트 탭에서 수정된 다음 이벤트 JSON을 사용하여 클러스터의 엔드포인트를 지정합니다.
{"endpoint": "replace_with_your_cluster_endpoint"}
-
이벤트 이름을 입력합니다(예:
dsql-sample-test
). 저장을 선택합니다. -
테스트를 선택합니다.
-
세부 정보를 선택하여 실행 응답 및 로그 출력을 확장합니다.
-
성공한 경우 Lambda 함수 실행 응답은 200 상태 코드를 반환할 것입니다.
{statusCode": 200, "endpoint": "your_cluster_endpoint"}
데이터베이스가 오류를 반환하거나 데이터베이스에 대한 연결이 실패하면 Lambda 함수 실행 응답은 500 상태 코드를 반환합니다.
{"statusCode": 500,"endpoint": "your_cluster_endpoint"}