PostgreSQL 배치에 외부 애플리케이션 연결

애플리케이션 및 드라이버는 연결 문자열을 사용하여 IBM Cloud® Databases for PostgreSQL에 연결합니다. 서비스는 드라이버 및 애플리케이션용으로 특별히 연결 문자열을 제공합니다. 연결 문자열은 배포 개요의 엔드포인트 패널에 표시되며 Cloud Databases CLI 플러그인Cloud Databases API에서도 검색할 수 있습니다.

연결 문자열은 배포에서 생성한 모든 자격 증명에서 사용할 수 있습니다. 모든 연결 및 애플리케이션에 admin 사용자를 사용할 수 있지만 애플리케이션을 연결하기 위해 특별히 사용자를 작성하는 것이 좋습니다. 자세한 내용은 연결 문자열 가져오기 를 참조하세요.

언어 드라이버를 사용하여 PostgreSQL 배치에 연결

드라이버가 배치에 연결하는 데 필요한 모든 정보는 연결 문자열의 "postgres" 섹션에 있습니다. 이 표에는 참조에 대한 분석이 포함되어 있습니다.

postgres/URI 연결 정보
필드 이름 색인 설명
Type 연결 유형 - PostgreSQL, 의 경우 "URI"입니다.
Scheme URI의 스키마 - PostgreSQL, 의 경우 "postgresql"입니다.
Path URI의 경로. PostgreSQL의 경우 데이터베이스 이름입니다. 기본값은 ibmclouddb입니다.
Authentication Username 연결하는 데 사용하는 사용자 이름입니다.
Authentication Password 사용자에 대한 비밀번호로 $PASSWORD로 표시될 수 있습니다.
Authentication Method 인증이 수행되는 방법이며 "직접" 인증은 드라이버에 의해 처리됩니다.
Hosts 0... 연결할 호스트 이름 및 포트입니다.
Composed 0... 스키마, 인증, 호스트 및 경로를 결합한 URI입니다.
Certificate Name 데이터베이스 배포를 위한 서비스 전용 인증서에 할당된 이름입니다.
Certificate Base64 base64 인코딩된 인증서 버전입니다.
  • 0... 배열에 이러한 항목이 하나 이상 있을 수 있음을 표시합니다.

다수의 PostgreSQL 드라이버는 연결 정보의 "구성" 필드에 표시되는 URI 형식의 연결 문자열이 주어지면 배치에 연결할 수 있습니다. 예를 들면 다음과 같습니다.

postgres://ibm_cloud_30399dec_4835_4967_a23d_30587a08d9a8:$PASSWORD@981ac415-5a35-4ac7-b6bb-fb609326dc42.8f7bfd8f3faa4218aec56e069eb46187.databases.appdomain.cloud:32704/ibmclouddb?sslmode=verify-full

다음 예제에서는 연결 문자열 및 Java 드라이버 jdbc의 정보를 사용하여 데이터베이스에 연결합니다.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.*;

public class PGConnect {

    private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    private Connection connect() {

        final String url = "jdbc:postgresql://host:port/ibmclouddb";

        Properties props = new Properties();
        props.setProperty("user","admin");
        props.setProperty("password","mypassword123");
        props.setProperty("ssl","true");
        props.setProperty("sslmode","verify-full");
        props.setProperty("sslrootcert", "/path/to/cert");

        Connection conn = null;
        while (conn == null) {
            try {
                conn = DriverManager.getConnection(url, props);
                System.out.println("Connected to PG");
            } catch (SQLException e) {
                System.out.printf("%s\n", e);
                LOGGER.info("Not connected, retying ...");
            }
        }

        return conn;

    }

    public static void main(String[] args) {

        PGConnect icd = new PGConnect();

        try {
            Connection connection = icd.connect();
            Statement stmt = connection.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT * from pg_database");
            while (rs.next()) {
                System.out.println("DB Name: " + rs.getString(1));
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }   
    }
}

다음 예제에서는 연결 문자열 및 Python 드라이버 Psycopg2의 정보를 사용하여 데이터베이스에 연결합니다. 이것은 오류 처리 또는 재시도 논리가 없는 단순한 연결 예제이며 프로덕션에 적합하지 않을 수 있습니다.

import psycopg2

try:
    conn = psycopg2.connect(
      host="hostname.databases.appdomain.cloud",
      port= 31525,
      user="username",
      password="password",
      sslmode="verify-full",
      sslrootcert="/path/to/cert/ca-certificate.crt",
      database="ibmclouddb")
except:
    print("Unable to connect to database")

cur = conn.cursor()
cur.execute("SELECT datname FROM pg_database")
rows = cur.fetchall()

print("List of databases:")
for row in rows:
    print("  ",row[0])

다음 예제에서는 연결 문자열 및 Node 드라이버 node-postgres의 정보를 사용하여 데이터베이스에 연결합니다.

const pg = require("pg");
const fs = require("fs");

let connectionString = "postgres://<username>:<password>@<host>:<port>/<database>";
let caCert = fs.readFileSync('/path/to/cert');

// set up a client with your PostgreSQL connection string and TLS options
let client = new pg.Client({
    connectionString: connectionString,
    ssl: {
    ca: caCert,
    rejectUnauthorized: true
    }
});


client.connect(function(err) {
    if (err) {
        console.log(err);
        process.exit(1);
    } else {
        // query for the names of the databases
        client.query(
            "SELECT datname FROM pg_database;",
            function(err, result) {
                if (err) {
                    console.log(err);
                }
                // return the names of the databases
                console.log(result.rows);
                client.end();
            }
        );
    }
});

node-postgres driver 를 사용하려면 배치의 연결 문자열에서 sslmode 매개변수를 제거하십시오. 그렇지 않은 경우 이 매개변수는 ssl: {...} 매개변수를 대체하여 CA 인증서가 올바르게 로드되지 않도록 합니다.

드라이버 TLS 및 서비스 전용 인증서 지원

Databases for PostgreSQL에 대한 모든 연결에는 TLS 1.2가 사용으로 설정되어 있으므로 연결하는 데 사용하는 드라이버가 암호화를 지원할 수 있어야 합니다. 또한 배포에는 서비스 전용 인증서가 함께 제공되므로 드라이버가 연결 시 서버를 확인할 수 있습니다.

자세한 정보는 Cloud Databases 인증서 FAQ를 참조하십시오.

서비스 전용 인증서 사용

  1. 엔드포인트 패널 또는 연결 정보의 Base64 필드에서 인증서 정보를 복사하십시오.
  2. 필요하면, Base64 문자열을 텍스트로 디코딩하십시오.
  3. 파일에 인증서를 저장하십시오. (제공된 이름 또는 자체 파일 이름을 사용할 수 있습니다.)
  4. 드라이버 또는 클라이언트에 인증서의 경로를 제공하십시오.

CLI 엔드포인트 패널
CLI 플러그인 정보 탭

서비스 전용 인증서를 위한 CLI 플러그인 지원

ibmcloud cdb deployment-cacert "example-deployment" 명령을 사용하여 CLI 플러그인을 사용하여 배포를 위해 디코딩된 인증서를 표시할 수 있습니다. base64를 텍스트로 디코딩합니다. 명령의 출력을 복사하여 파일에 저장하고 드라이버에 대한 파일 경로를 제공하십시오.

기타 드라이버

PostgreSQL에는 다양한 언어 드라이버가 있습니다. 다음 표에서는 몇 가지 가장 일반적인 언어 드라이버를 다룹니다.

postgresql 드라이버
언어 드라이버 예제
PHP pgsql 링크
Ruby ruby-pg 링크
Ruby on Rail Rails 링크
C# ODBC 링크
Go pq 링크
Node node-postgres 링크