Amazon Aurora DSQL에서 AWS Lambda 사용 - Amazon Aurora DSQL

Amazon Aurora DSQL은 미리보기 서비스로 제공됩니다. 자세한 내용은 AWS 서비스 약관의 베타 및 미리보기를 참조하세요.

Amazon Aurora DSQL에서 AWS Lambda 사용

다음 자습서에서는 Aurora DSQL에서 Lambda를 사용하는 방법을 설명합니다.

사전 조건 

  • Lambda 함수 생성 권한. 자세한 내용은 Getting started with Lambda를 참조하세요.

  • Lambda가 생성한 IAM 정책을 생성하거나 수정할 수 있는 권한. iam:CreatePolicyiam:AttachRolePolicy에 대한 권한이 필요합니다. 자세한 내용은 Actions, resources, and condition keys for IAM을 참조하세요.

  • npm v8.5.3 이상이 설치되어 있어야 합니다.

  • zip v3.0 이상이 설치되어 있어야 합니다.

AWS Lambda에서 새로운 함수 생성
  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

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

  3. dsql-sample과 같은 이름을 입력합니다.

  4. Lambda가 기본 Lambda 권한으로 새 역할을 생성하도록 기본 설정을 편집하지 마세요.

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

Lambda 실행 역할이 클러스터에 연결하도록 권한 부여
  1. Lambda 함수에서 구성 > 권한을 선택합니다.

  2. 역할 이름을 선택하여 IAM 콘솔에서 실행 역할을 엽니다.

  3. 권한 추가 > 인라인 정책 생성을 선택하고 JSON 편집기를 사용합니다.

  4. 작업에서 다음 작업을 붙여 넣어 IAM ID가 관리자 데이터베이스 역할을 사용하여 연결하도록 승인합니다.

    "Action": ["dsql:DbConnectAdmin"],
    참고

    시작하기 위한 사전 조건 단계를 최소화하기 위해 관리자 역할을 사용합니다. 프로덕션 애플리케이션에 관리자 데이터베이스 역할을 사용해서는 안 됩니다. 데이터베이스에 대한 최소한의 권한 부여를 사용하여 사용자 지정 데이터베이스 역할을 생성하는 방법은 IAM 역할과 함께 데이터베이스 역할 사용 섹션을 참조하세요.

  5. 리소스에서 클러스터의 Amazon 리소스 이름(ARN)을 추가합니다. 와일드카드를 사용할 수도 있습니다.

    "Resource": ["*"]
  6. 다음을 선택합니다.

  7. 정책의 이름을 입력합니다(예: dsql-sample-dbconnect).

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

Lambda에 업로드할 패키지 생성
  1. myfunction이라는 폴더를 생성합니다.

  2. 폴더 안에 다음 내용이 담긴 package.json이라는 파일을 새로 생성합니다.

    { "dependencies": { "@aws-sdk/dsql-signer": "^3.705.0", "assert": "2.1.0", "pg": "^8.13.1" } }
  3. 폴더 안에서 디렉터리에 다음 내용이 담긴 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; };
  4. 다음과 같은 명령을 사용하여 패키지를 생성합니다.

    npm install zip -r pkg.zip .
코드 패키지 업로드 및 Lambda 함수 테스트
  1. Lambda 함수의 코드 탭에서 에서 업로드 > .zip 파일을 선택합니다.

  2. 생성한 pkg.zip을 업로드합니다. 자세한 내용은 .zip 파일 아카이브를 사용하여 Node.js Lambda 함수 배포를 참조하세요.

  3. Lambda 함수의 테스트 탭에서 다음 JSON 페이로드를 붙여 넣고 클러스터 ID를 사용하도록 수정합니다.

  4. Lambda 함수의 테스트 탭에서 수정된 다음 이벤트 JSON을 사용하여 클러스터의 엔드포인트를 지정합니다.

    {"endpoint": "replace_with_your_cluster_endpoint"}
  5. 이벤트 이름을 입력합니다(예: dsql-sample-test). 저장을 선택합니다.

  6. 테스트를 선택합니다.

  7. 세부 정보를 선택하여 실행 응답 및 로그 출력을 확장합니다.

  8. 성공한 경우 Lambda 함수 실행 응답은 200 상태 코드를 반환할 것입니다.

    {statusCode": 200, "endpoint": "your_cluster_endpoint"}

    데이터베이스가 오류를 반환하거나 데이터베이스에 대한 연결이 실패하면 Lambda 함수 실행 응답은 500 상태 코드를 반환합니다.

    {"statusCode": 500,"endpoint": "your_cluster_endpoint"}