IAM যাচাইকরণের মাধ্যমে AlloyDB for PostgreSQL-এ Java অ্যাপ্লিকেশন কানেক্ট করা

১. শুরু করার আগে

Java ও AlloyDB: সহজ, সুরক্ষিত কানেক্টিভিটি

AlloyDB for PostgreSQL হল Google Cloud-এর সম্পূর্ণ ম্যানেজ করা, PostgreSQL-এর সাথে মানানসই ডেটাবেস পরিষেবা যা এন্টারপ্রাইজ ওয়ার্কলোডের জন্য উপযুক্ত। AlloyDB-তে জাভা অ্যাপ্লিকেশন নিরাপদে ও দক্ষতার সাথে কানেক্ট করার কাজটি AlloyDB Java Connector (alloydb-jdbc-connector)-এর মাধ্যমে করা হয়, এটি একটি ক্লায়েন্ট লাইব্রেরি যা স্ট্যান্ডার্ড JDBC ড্রাইভারের চেয়েও বেশি কিছু।

AlloyDB Java Connector-এর ম্যাজিক

alloydb-jdbc-connector স্ট্যান্ডার্ড PostgreSQL JDBC ড্রাইভারের (org.postgresql:postgresql) জন্য স্মার্ট SocketFactory হিসেবে কাজ করে। এটি একটি সুরক্ষিত ডেটাবেস কানেকশন সেট-আপ করার প্রক্রিয়াকে অ্যাবস্ট্র্যাক্ট করে, যাতে আপনি নেটওয়ার্ক নিরাপত্তা বা ক্রেডেনশিয়াল রোটেশনের পরিবর্তে অ্যাপ্লিকেশন লজিকে ফোকাস করতে পারেন:

  • mTLS 1.3 এনক্রিপশন: আপনাকে ম্যানুয়ালি SSL/TLS ক্লায়েন্ট সার্টিফিকেট ম্যানেজ করার প্রয়োজন ছাড়াই আপনার JVM এবং AlloyDB ইনস্ট্যান্সের মধ্যে অটোমেটিক একটি পারস্পরিকভাবে যাচাইকৃত TLS 1.3 কানেকশন স্থাপন করে।
  • IAM-ভিত্তিক অনুমোদন: স্ট্যাটিক ডেটাবেস পাসওয়ার্ডের উপর নির্ভর করার পরিবর্তে, কানেক্টর Google Cloud IAM এবং অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল (ADC) ব্যবহার করে অটোমেটিক স্বল্প-মেয়াদী OAuth2 অ্যাক্সেস টোকেন পায়।
  • ডায়নামিক IP রেজোলিউশন: আপনার ডেটাবেস ইনস্ট্যান্সের বর্তমান IP অ্যাড্রেস (PRIVATE, PUBLIC বা Private Service Connect PSC) ডায়নামিকভাবে সমাধান করার জন্য AlloyDB Admin API-কে কোয়েরি করে। আপনাকে হোস্টনেম বা IP অ্যাড্রেস হার্ড-কোড করতে হবে না, যার ফলে ফেলওভার ও রক্ষণাবেক্ষণ স্বচ্ছ হয়।

AlloyDB Java Connector কীভাবে কাজ করে

পূর্বশর্ত

  • Java, Maven এবং SQL/JDBC-এর প্রাথমিক ধারণা সম্পর্কে জানা।
  • Google Cloud CLI (gcloud) এবং IAM ভূমিকা সম্পর্কে প্রাথমিক ধারণা।

আপনি কী করবেন

  • পাসওয়ার্ড ছাড়া IAM ডেটাবেস যাচাইকরণ-এর জন্য AlloyDB ইনস্ট্যান্স ও পরিষেবা অ্যাকাউন্ট কনফিগার করুন।
  • IAM প্রিন্সিপালকে সবচেয়ে কম-প্রিভিলেজ PostgreSQL স্কিমা ও টেবিল সংক্রান্ত অনুমতি দিন।
  • AlloyDB SocketFactory ব্যবহার করে Plain JDBC এবং HikariCP-এর সাথে প্রোডাকশন-গ্রেড DataSource কনফিগার করা।
  • Spring Boot, Quarkus ও Micronaut অ্যাপ্লিকেশনে AlloyDB Java Connector ইন্টিগ্রেট করা।
  • GraalVM নেটিভ ইমেজ কম্পাইলেশনের জন্য AlloyDB SocketFactory রেজিস্টার করুন এবং সাধারণ IAM অথেন্টিকেশন সংক্রান্ত সমস্যার সমাধান করুন।

আপনার কী প্রয়োজন হবে

  • বিলিং চালু থাকা একটি Google Cloud প্রোজেক্ট এবং একটি অ্যাক্টিভ AlloyDB ক্লাস্টার ও প্রাইমারি ইনস্ট্যান্স (AlloyDB ক্লাস্টার তৈরি করার গাইড দেখুন অথবা দুই সেকেন্ডের মধ্যে একটি AlloyDB Express ক্লাস্টার স্পিন আপ করুন)।
  • আপনার প্রোজেক্টে roles/alloydb.admin এবং roles/resourcemanager.projectIamAdmin IAM ভূমিকা।
  • Java 17 বা তার পরবর্তী ভার্সন (Java 17 বা 21 LTS সাজেস্ট করা হয়) এবং Apache Maven ইনস্টল করা আছে।
  • gcloud CLI এবং psql ক্লায়েন্ট ইনস্টল করা (বা Google Cloud Shell-এ অ্যাক্সেস)।

২. AlloyDB-তে IAM ডেটাবেস যাচাইকরণ সেট-আপ করা

Java কোড লেখার আগে, আপনাকে IAM টোকেন গ্রহণ করার জন্য আপনার AlloyDB ইনস্ট্যান্স কনফিগার করতে হবে এবং IAM আইডেন্টিটি তৈরি করতে হবে যা আপনার অ্যাপ্লিকেশন তিনটি লেয়ার জুড়ে ব্যবহার করবে: Google Cloud IAM, AlloyDB কন্ট্রোল প্লেন এবং PostgreSQL ইঞ্জিন।

AlloyDB IAM ডেটাবেস যাচাইকরণের জন্য থ্রি-লেয়ার সেট-আপ

এনভায়রনমেন্ট ভেরিয়েবল সেট করুন

আপনার টার্মিনালে, আপনার Google Cloud প্রোজেক্ট এবং AlloyDB ইনস্ট্যান্সের সাথে সম্পর্কিত ভেরিয়েবল এক্সপোর্ট করুন ( প্লেসহোল্ডার আপনার ভ্যালু দিয়ে পরিবর্তন করুন):

export PROJECT_ID="<PROJECT_ID>"
export REGION="europe-west1"
export CLUSTER_ID="<CLUSTER_ID>"
export INSTANCE_ID="<INSTANCE_ID>"
export DB_NAME="dvdrental"

প্রয়োজনীয় API চালু করুন

আপনার প্রোজেক্টে AlloyDB, Compute Engine, Cloud Resource Manager, IAM এবং Service Usage API চালু করুন:

gcloud services enable \
    alloydb.googleapis.com \
    compute.googleapis.com \
    cloudresourcemanager.googleapis.com \
    iam.googleapis.com \
    serviceusage.googleapis.com \
    --project="${PROJECT_ID}"

পরিষেবা অ্যাকাউন্ট তৈরি করা এবং IAM ভূমিকা প্রদান করা

একটি ডেডিকেটেড পরিষেবা অ্যাকাউন্ট তৈরি করুন যা আপনার Java অ্যাপ্লিকেশনের পরিচয় হিসাবে কাজ করবে:

gcloud iam service-accounts create java-alloydb-connector \
    --project="${PROJECT_ID}" \
    --display-name="Java Application DB Connector"

AlloyDB Java Connector-এর জন্য প্রয়োজনীয় দুটি IAM ভূমিকা পরিষেবা অ্যাকাউন্টকে দিন:

  1. roles/alloydb.client: ইনস্ট্যান্স মেটাডেটা ফেচ করতে এবং AlloyDB Admin API থেকে ক্ষণস্থায়ী mTLS সার্টিফিকেটের অনুরোধ করতে প্রয়োজন।
  2. roles/serviceusage.serviceUsageConsumer: IAM ডেটাবেস যাচাইকরণের জন্য প্রয়োজন।
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:java-alloydb-connector@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/alloydb.client"

gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:java-alloydb-connector@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/serviceusage.serviceUsageConsumer"

AlloyDB ইনস্ট্যান্সে IAM যাচাইকরণ চালু করুন

alloydb.iam_authentication=on সেট করতে আপনার AlloyDB ইনস্ট্যান্স ফ্ল্যাগ আপডেট করুন। এটি একটি ডায়নামিক ফ্ল্যাগ এবং ইনস্ট্যান্স রিস্টার্ট না করেই অবিলম্বে কার্যকর হয়:

gcloud alloydb instances update "${INSTANCE_ID}" \
    --cluster="${CLUSTER_ID}" \
    --region="${REGION}" \
    --project="${PROJECT_ID}" \
    --database-flags=alloydb.iam_authentication=on

IAM ডেটাবেস ব্যবহারকারীকে রেজিস্টার করুন

gcloud ব্যবহার করে আপনার AlloyDB ক্লাস্টারে IAM_BASED ডেটাবেস ব্যবহারকারী হিসেবে পরিষেবা অ্যাকাউন্ট রেজিস্টার করুন:

gcloud alloydb users create "java-alloydb-connector@${PROJECT_ID}.iam" \
    --cluster="${CLUSTER_ID}" \
    --region="${REGION}" \
    --project="${PROJECT_ID}" \
    --type=IAM_BASED

PostgreSQL স্কিমা ও টেবিল সংক্রান্ত অনুমতি দিন

নতুন তৈরি করা IAM ডেটাবেস ব্যবহারকারীদের ডিফল্ট হিসেবে কোনও টেবিল প্রিভিলেজ থাকে না। postgres অ্যাডমিন ব্যবহারকারী হিসেবে আপনার AlloyDB ইনস্ট্যান্সে কানেক্ট করুন (psql বা Cloud Console-এ AlloyDB Studio-এর মাধ্যমে) এবং আপনার টার্গেট ডেটাবেস ও টেবিলে অ্যাক্সেস দিন (যেমন DVD Rental স্যাম্পেল ডেটাবেস):

-- Connect to your target database first
\c dvdrental

-- (Optional) Create a sample film table if your database is empty
CREATE TABLE IF NOT EXISTS public.film (
    film_id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    release_year INTEGER DEFAULT 2006,
    rating VARCHAR(10) DEFAULT 'PG',
    rental_rate NUMERIC(4,2) DEFAULT 2.99
);

INSERT INTO public.film (film_id, title, release_year, rating, rental_rate) VALUES
    (1, 'Academy Dinosaur', 2006, 'PG', 0.99),
    (2, 'Ace Goldfinger', 2006, 'G', 4.99),
    (3, 'Adaptation Holes', 2006, 'NC-17', 2.99),
    (4, 'Affair Prejudice', 2006, 'G', 2.99),
    (5, 'African Egg', 2006, 'G', 2.99)
ON CONFLICT (film_id) DO NOTHING;

-- Grant permissions to the IAM user (double quotes are required because of '@' and '.')
GRANT CONNECT ON DATABASE "dvdrental" TO "java-alloydb-connector@<PROJECT_ID>.iam";
GRANT USAGE ON SCHEMA public TO "java-alloydb-connector@<PROJECT_ID>.iam";
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO "java-alloydb-connector@<PROJECT_ID>.iam";

AlloyDB Studio (বা psql)-তে এইসব স্টেটমেন্ট রান করার সময়, আপনি public.film স্কিমা পরীক্ষা করতে এবং স্যাম্পেল সারি যাচাই করতে পারবেন:

AlloyDB Studio-তে IAM অনুমতি প্রদান করা এবং public.film পরীক্ষা করা

লোকাল অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল (ADC) কনফিগার করুন

Cloud Run, Google Kubernetes Engine (GKE) বা Compute Engine-এ রান করার সময়, সরাসরি ওয়ার্কলোডের সাথে java-alloydb-connector পরিষেবা অ্যাকাউন্ট অ্যাটাচ করুন। আপনার ওয়ার্কস্টেশনে লোকালভাবে রান করার সময়, সার্ভিস অ্যাকাউন্টের ছদ্মবেশ ধারণ করুন যাতে ADC সেই পরিচয়ের জন্য টোকেন তৈরি করে:

gcloud auth application-default login \
    --impersonate-service-account="java-alloydb-connector@${PROJECT_ID}.iam.gserviceaccount.com"

৩. Plain JDBC ও HikariCP-এর সাথে কানেক্ট করুন

যেকোনও প্রোডাকশন-গ্রেড Java অ্যাপ্লিকেশনের জন্য, কানেকশন পুল অপরিহার্য এবং HikariCP হল শিল্পের নির্ধারিত মান। এই ধাপে, আপনি একটি সাধারণ JDBC + HikariCP অ্যাপ্লিকেশন তৈরি করবেন যা com.google.cloud.alloydb.SocketFactory-এ সকেট তৈরি করার দায়িত্ব অর্পণ করে।

Maven প্রোজেক্ট (pom.xml) তৈরি করুন

PostgreSQL JDBC ড্রাইভার (42.7.14), AlloyDB Java Connector (1.4.0) ও HikariCP (7.1.0) সহ pom.xml ফাইল সহ একটি নতুন ডিরেক্টরি jdbc-app তৈরি করুন:

mkdir -p jdbc-app/src/main/java
cd jdbc-app

pom.xml তৈরি করুন:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example.alloydb</groupId>
    <artifactId>alloydb-jdbc-sample</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <exec.mainClass>AlloyDBConnectivity</exec.mainClass>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.7.14</version>
        </dependency>

        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>alloydb-jdbc-connector</artifactId>
            <version>1.4.0</version>
        </dependency>

        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>7.1.0</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.16</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.5.0</version>
                <configuration>
                    <cleanupDaemonThreads>false</cleanupDaemonThreads>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

AlloyDBConnectivity.java তৈরি করুন

src/main/java/AlloyDBConnectivity.java তৈরি করুন (GitHub Gist-এ দেখুন):

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class AlloyDBConnectivity {
    // Retrieve configuration from environment variables
    private static final String ALLOYDB_INSTANCE_URI = System.getenv("ALLOYDB_INSTANCE_NAME"); // e.g., projects/<PROJECT_ID>/locations/<REGION>/clusters/<CLUSTER_ID>/instances/<INSTANCE_ID>
    private static final String ALLOYDB_DB_NAME = System.getenv("ALLOYDB_DB"); // e.g., "dvdrental"
    private static final String ALLOYDB_USER = System.getenv("ALLOYDB_USER"); // e.g., "java-alloydb-connector@<PROJECT_ID>.iam"
    private static final String ALLOYDB_PASS = System.getenv("ALLOYDB_PASS"); // Database password if not using IAM auth

    public static HikariDataSource createDataSource() {
        HikariConfig config = new HikariConfig();

        // The JDBC URL does not need a host or port. The SocketFactory will resolve the IP address.
        config.setJdbcUrl(String.format("jdbc:postgresql:///%s", ALLOYDB_DB_NAME));
        config.setUsername(ALLOYDB_USER);

        // Only set the password if you are NOT using IAM authentication.
        if (System.getenv("ALLOYDB_ENABLE_IAM_AUTH") == null || !System.getenv("ALLOYDB_ENABLE_IAM_AUTH").equalsIgnoreCase("true")) {
            config.setPassword(ALLOYDB_PASS);
        }

        // 1. Set the SocketFactory to the AlloyDB Connector's implementation.
        config.addDataSourceProperty("socketFactory", "com.google.cloud.alloydb.SocketFactory");

        // 2. Tell the connector which AlloyDB instance to connect to.
        config.addDataSourceProperty("alloydbInstanceName", ALLOYDB_INSTANCE_URI);

        // 3. (Recommended) Enable IAM database authentication.
        if (System.getenv("ALLOYDB_ENABLE_IAM_AUTH") != null && System.getenv("ALLOYDB_ENABLE_IAM_AUTH").equalsIgnoreCase("true")) {
            config.addDataSourceProperty("alloydbEnableIAMAuth", "true");
        }

        // 4. (Optional) Specify IP type (e.g., "PRIVATE", "PUBLIC", "PSC"). Defaults to PRIVATE.
        String ipType = System.getenv("ALLOYDB_IP_TYPE");
        if (ipType != null) {
            config.addDataSourceProperty("alloydbIpType", ipType);
        }

        // Baseline HikariCP settings
        config.setMaximumPoolSize(10);
        config.setMinimumIdle(2);
        config.setConnectionTimeout(30000); // 30 seconds
        config.setIdleTimeout(600000);      // 10 minutes
        config.setMaxLifetime(1800000);     // 30 minutes

        return new HikariDataSource(config);
    }

    public static void main(String[] args) {
        String sql = "SELECT title, release_year FROM public.film ORDER BY film_id LIMIT 5";

        try (HikariDataSource pool = createDataSource();
             Connection conn = pool.getConnection();
             PreparedStatement stmt = conn.prepareStatement(sql);
             ResultSet rs = stmt.executeQuery()) {
            System.out.println("Successfully connected to AlloyDB via IAM! Sample films:");
            while (rs.next()) {
                System.out.printf(" - %s (%d)%n", rs.getString("title"), rs.getInt("release_year"));
            }
        } catch (SQLException e) {
            System.err.println("Database connection failed: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

AlloyDB JDBC URL ও HikariCP কনফিগারেশনের অ্যানাটমি

প্লেন JDBC অ্যাপ্লিকেশন রান করা

আপনার AlloyDB ইনস্ট্যান্সের জন্য এনভায়রনমেন্ট ভেরিয়েবল এক্সপোর্ট করুন (পাবলিক আইপির মাধ্যমে আপনার VPC-এর বাইরে থেকে কানেক্ট করলে ALLOYDB_IP_TYPE="PUBLIC" সেট করুন অথবা VPC-এর মধ্যে থাকলে "PRIVATE" / "PSC" সেট করুন) এবং অ্যাপ্লিকেশন রান করুন:

export ALLOYDB_INSTANCE_NAME="projects/${PROJECT_ID}/locations/${REGION}/clusters/${CLUSTER_ID}/instances/${INSTANCE_ID}"
export ALLOYDB_DB="${DB_NAME}"
export ALLOYDB_USER="java-alloydb-connector@${PROJECT_ID}.iam"
export ALLOYDB_ENABLE_IAM_AUTH="true"
export ALLOYDB_IP_TYPE="PRIVATE" # Set to PUBLIC if connecting over Public IP from a local laptop

mvn compile exec:java

আপনি এই ধরনের আউটপুট দেখতে পাবেন:

[AlloyDBConnectivity.main()] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
[AlloyDBConnectivity.main()] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@1998bf07
[AlloyDBConnectivity.main()] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
Successfully connected to AlloyDB via IAM! Sample films:
 - Academy Dinosaur (2006)
 - Ace Goldfinger (2006)
 - Adaptation Holes (2006)
 - Affair Prejudice (2006)
 - African Egg (2006)

প্লেন JDBC এবং HikariCP স্যাম্পেলের টার্মিনাল আউটপুট

৪. Spring Boot-এর সাথে কানেক্ট করা

Spring Boot আপনার অ্যাপ্লিকেশন প্রপার্টি থেকে HikariCP কানেকশন পুল অটোমেটিক কনফিগার করে ডেটাবেস কানেক্টিভিটি সহজ করে তোলে। AlloyDB Java Connector ইন্টিগ্রেট করার জন্য কোনও কাস্টম DataSource বিন কোডের প্রয়োজন হয় না।

Spring Boot প্রোজেক্ট (pom.xml) তৈরি করুন

নতুন ডিরেক্টরি spring-boot-app তৈরি করুন:

cd ..
mkdir -p spring-boot-app/src/main/java/com/example/alloydb
mkdir -p spring-boot-app/src/main/resources
cd spring-boot-app

spring-boot-starter-jdbc (যার মধ্যে HikariCP অন্তর্ভুক্ত), org.postgresql:postgresql ও com.google.cloud:alloydb-jdbc-connector-এর সাহায্যে pom.xml তৈরি করুন:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.0.5</version>
        <relativePath/>
    </parent>

    <groupId>com.example.alloydb</groupId>
    <artifactId>alloydb-spring-boot-sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.7.14</version>
        </dependency>

        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>alloydb-jdbc-connector</artifactId>
            <version>1.4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties বা এনভায়রনমেন্ট ভেরিয়েবেল কনফিগার করুন

আপনি src/main/resources/application.properties-এ কানেকশন URL কনফিগার করতে পারবেন:

# No host or port is needed; the SocketFactory handles it.
spring.datasource.url=jdbc:postgresql:///dvdrental?socketFactory=com.google.cloud.alloydb.SocketFactory&alloydbInstanceName=projects/<PROJECT_ID>/locations/<REGION>/clusters/<CLUSTER_ID>/instances/<INSTANCE_ID>&alloydbEnableIAMAuth=true
spring.datasource.username=java-alloydb-connector@<PROJECT_ID>.iam
# No password required when alloydbEnableIAMAuth is true

আপনার সোর্স ফাইল প্রোজেক্ট আইডি বা ইনস্ট্যান্সের নাম থেকে সম্পূর্ণ মুক্ত রাখতে, আপনি application.properties খালি রাখতে পারেন এবং রানটাইমে এইসব স্ট্যান্ডার্ড Spring Boot এনভায়রনমেন্ট ভেরিয়েবেল প্রদান করতে পারেন:

এনভায়রনমেন্ট ভেরিয়েবল

ভ্যালু

SPRING_DATASOURCE_URL

jdbc:postgresql:///dvdrental?socketFactory=com.google.cloud.alloydb.SocketFactory&alloydbInstanceName=projects//locations//clusters//instances/&alloydbEnableIAMAuth=true

SPRING_DATASOURCE_USERNAME

java-alloydb-connector@.iam

AlloyDbTestApplication.java তৈরি করুন

src/main/java/com/example/alloydb/AlloyDbTestApplication.java তৈরি করুন (GitHub Gist-এ দেখুন):

package com.example.alloydb;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;

@SpringBootApplication
public class AlloyDbTestApplication {

    public static void main(String[] args) {
        System.exit(SpringApplication.exit(SpringApplication.run(AlloyDbTestApplication.class, args)));
    }

    @Bean
    CommandLineRunner testConnection(JdbcTemplate jdbcTemplate) {
        return args -> {
            String result = jdbcTemplate.queryForObject("SELECT 'Connection Successful!'", String.class);
            System.out.println(">>> ALLOYDB STATUS: " + result);
        };
    }
}

Spring Boot অ্যাপ্লিকেশন রান করা

এনভায়রনমেন্ট ভেরিয়েবল এক্সপোর্ট করুন এবং mvn spring-boot:run-এর সাহায্যে অ্যাপ চালান:

export SPRING_DATASOURCE_URL="jdbc:postgresql:///${DB_NAME}?socketFactory=com.google.cloud.alloydb.SocketFactory&alloydbInstanceName=projects/${PROJECT_ID}/locations/${REGION}/clusters/${CLUSTER_ID}/instances/${INSTANCE_ID}&alloydbEnableIAMAuth=true"
export SPRING_DATASOURCE_USERNAME="java-alloydb-connector@${PROJECT_ID}.iam"

mvn spring-boot:run

আপনি এগুলি দেখতে পাবেন:

>>> ALLOYDB STATUS: Connection Successful!

Spring Boot অটো-কনফিগারেশন এবং লাইভ এক্সিকিউশন আউটপুট

৫. Quarkus, Micronaut ও GraalVM Native Image-এর সাথে কানেক্ট করুন

AlloyDB Java Connector, JDBC ড্রাইভার লেভেলে কাজ করে বলে, ক্লাউড-নেটিভ Java ফ্রেমওয়ার্কের মধ্যে পরিবর্তন করলে, আপনি যেভাবে ডেটাবেস ট্রাফিক সুরক্ষিত করেন বা পরিচয় ম্যানেজ করেন, তাতে কোনও পরিবর্তন হয় না। Quarkus এবং Micronaut, উভয়ই অন্তর্নিহিত JDBC ড্রাইভারকে র‍্যাপ করে এবং ADC-এর মাধ্যমে কানেক্টরে mTLS এনক্রিপশন, ডায়নামিক IP রেজোলিউশন এবং IAM যাচাইকরণ ডেলিগেট করে।

AlloyDB-এর সাথে Cloud-Native Java ফ্রেমওয়ার্ক ও GraalVM Native Image

Quarkus কনফিগারেশন (Agroal-এর সাথে application.properties)

Quarkus অ্যাপ্লিকেশনে (quarkus-agroal এবং quarkus-jdbc-postgresql), আপনার ডিপেন্ডেন্সিতে com.google.cloud:alloydb-jdbc-connector:1.4.0 যোগ করুন এবং src/main/resources/application.properties-এ quarkus.datasource.jdbc.additional-jdbc-properties-এর মাধ্যমে কানেক্টর প্যারামিটার পাস করুন:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=java-alloydb-connector@<PROJECT_ID>.iam
quarkus.datasource.jdbc.url=jdbc:postgresql:///dvdrental
quarkus.datasource.jdbc.additional-jdbc-properties.socketFactory=com.google.cloud.alloydb.SocketFactory
quarkus.datasource.jdbc.additional-jdbc-properties.alloydbInstanceName=projects/<PROJECT_ID>/locations/<REGION>/clusters/<CLUSTER_ID>/instances/<INSTANCE_ID>
quarkus.datasource.jdbc.additional-jdbc-properties.alloydbEnableIAMAuth=true

Micronaut কনফিগারেশন (HikariCP সহ application.yml)

Micronaut অ্যাপ্লিকেশনে (micronaut-jdbc-hikari), com.google.cloud:alloydb-jdbc-connector:1.4.0 যোগ করুন এবং src/main/resources/application.yml কনফিগার করুন:

datasources:
  default:
    url: jdbc:postgresql:///dvdrental?socketFactory=com.google.cloud.alloydb.SocketFactory&alloydbInstanceName=projects/<PROJECT_ID>/locations/<REGION>/clusters/<CLUSTER_ID>/instances/<INSTANCE_ID>&alloydbEnableIAMAuth=true
    username: java-alloydb-connector@<PROJECT_ID>.iam
    driver-class-name: org.postgresql.Driver

GraalVM Native Image-এর জন্য কানেক্টর রেজিস্টার করা হচ্ছে

আপনার অ্যাপ্লিকেশনকে GraalVM নেটিভ ইমেজে (Spring Boot 3+, Quarkus বা Micronaut সহ) কম্পাইল করার সময়, একটি গুরুত্বপূর্ণ বিবরণ রয়েছে: Reflection।

PostgreSQL JDBC ড্রাইভার রিফ্লেকশন ব্যবহার করে ক্লাস নেম অনুযায়ী ডায়নামিকভাবে com.google.cloud.alloydb.SocketFactory ইনস্ট্যান্সিয়েট করে। নেটিভ কম্পাইলেশনের সময় GraalVM-এর স্ট্যাটিক অ্যানালিসিস যাতে ক্লাস স্ট্রিপ না করে, তার জন্য এটি স্পষ্টভাবে রেজিস্টার করুন:

  • Spring Boot 3+: আপনার প্রধান অ্যাপ্লিকেশন বা @Configuration ক্লাসে @RegisterReflectionForBinding(com.google.cloud.alloydb.SocketFactory.class) যোগ করুন:
    @SpringBootApplication
    @RegisterReflectionForBinding(com.google.cloud.alloydb.SocketFactory.class)
    public class AlloyDbTestApplication { ... }
    
  • Quarkus: আপনার প্রধান ক্লাস বা CDI বিন-এ @RegisterForReflection(targets = com.google.cloud.alloydb.SocketFactory.class) যোগ করুন:
    @QuarkusMain
    @RegisterForReflection(targets = com.google.cloud.alloydb.SocketFactory.class)
    public class QuarkusAlloyDbApp implements QuarkusApplication { ... }
    

৬. সাধারণ IAM ও কানেক্টিভিটি সংক্রান্ত সমস্যার সমাধান করা

আপনি FATAL: password authentication failed for user বা AlloyDB IAM authentication failed সমস্যার সম্মুখীন হলে, নিম্নলিখিত চারটি ক্ষেত্র যাচাই করুন:

AlloyDB IAM এবং কানেক্টিভিটি সংক্রান্ত সমস্যার সমাধান করার চিট শিট

১. পরিষেবা অ্যাকাউন্ট ডেটাবেস ইউজারনেম থেকে .gserviceaccount.com সরান

IAM যাচাইকরণ ব্যর্থ হওয়ার সবচেয়ে সাধারণ কারণ হল ডেটাবেস ইউজারনেম হিসেবে সম্পূর্ণ পরিষেবা অ্যাকাউন্ট ইমেল আইডি পাস করা। প্রিন্সিপাল টাইপের উপর নির্ভর করে AlloyDB, IAM ডেটাবেস ব্যবহারকারীর নাম আলাদাভাবে ফর্ম্যাট করে:

  • IAM পরিষেবা অ্যাকাউন্টের জন্য (.gserviceaccount.com বাদ দিন): আপনার Google Cloud পরিষেবা অ্যাকাউন্টের ইমেল java-alloydb-connector@.iam.gserviceaccount.com হলে, আপনাকে .gserviceaccount.com প্রত্যয়টি অবশ্যই সরিয়ে দিতে হবে এবং আপনার JDBC/AlloyDB ডেটাবেস ব্যবহারকারীর নাম java-alloydb-connector@.iam হিসেবে সেট করতে হবে।
  • IAM ব্যবহারকারীর অ্যাকাউন্ট বা গ্রুপের জন্য (সম্পূর্ণ ইমেল আইডি রাখুন): আপনি যদি কোনও ব্যক্তি হিসেবে Google Workspace বা Cloud Identity ব্যবহারকারীকে যাচাই করেন, তাহলে আপনার সম্পূর্ণ ইমেল আইডি অপরিবর্তিত রেখে ব্যবহার করুন (যেমন, )।

২. ডেটাবেস ব্যবহারকারী কীভাবে তৈরি করা হয়েছে তা যাচাই করুন

আপনি কি gcloud alloydb users create --type=IAM_BASED (বা Console/Terraform)-এর মাধ্যমে ব্যবহারকারীকে রেজিস্টার করেছেন? র SQL CREATE USER ব্যবহার করে কোনও ব্যবহারকারী তৈরি করলে তা IAM যাচাইকরণের জন্য কাজ করবে না কারণ AlloyDB কন্ট্রোল প্লেনে GRANT alloydbiamuser সীমাবদ্ধ করে।

৩. আপনার অ্যাক্টিভ ADC পরিচয় যাচাই করুন

যে পরিবেশে Java প্রসেস চলছে সেটি টার্গেট IAM প্রিন্সিপাল হিসেবে যাচাই করা হয়েছে কিনা তা নিশ্চিত করুন:

  • লোকাল ওয়ার্কস্টেশন (পরিষেবা অ্যাকাউন্ট হিসেবে কানেক্ট করা): gcloud auth application-default login --impersonate-service-account=java-alloydb-connector@.iam.gserviceaccount.com চালান যাতে ADC আপনার ব্যক্তিগত ইমেলের পরিবর্তে পরিষেবা অ্যাকাউন্টের জন্য টোকেন মিন্ট করে।
  • Cloud Run / GKE: নিশ্চিত করুন যে পরিষেবা অ্যাকাউন্টটি ওয়ার্কলোডের সাথে অ্যাটাচ করা আছে এবং এতে roles/alloydb.client ও roles/serviceusage.serviceUsageConsumer, দুটিই আছে।

৪. IAM প্রোপাগেশন ও নেটওয়ার্ক রাউটিংয়ের জন্য অ্যাকাউন্ট

  • IAM প্রোপাগেশন ডিলে: IAM নীতি বাইন্ডিং প্রোপাগেট হতে ৬০–১২০ সেকেন্ড সময় লাগতে পারে। আপনি যদি এইমাত্র পরিষেবা অ্যাকাউন্ট বা ভূমিকা বাইন্ডিং তৈরি করে থাকেন, তাহলে এক মিনিট অপেক্ষা করে আবার চেষ্টা করুন।
  • VPC নেটওয়ার্ক অ্যাক্সেস: ডিফল্ট হিসেবে, AlloyDB Java Connector ইনস্ট্যান্সের PRIVATE IP-তে কানেক্ট করে। আপনার অ্যাপ্লিকেশন Cloud Run-এ রান করলে, Direct VPC Egress (পুরনো সার্ভারলেস VPC অ্যাক্সেস কানেক্টরের তুলনায় কম লেটেন্সি ও খরচের জন্য সাজেস্ট করা হয়) কনফিগার করুন অথবা Private Service Connect (PSC)-এর মাধ্যমে কানেক্ট করুন। VPC-এর বাইরে কোনও লোকাল মেশিন থেকে কানেক্ট করলে, ইনস্ট্যান্সে পাবলিক IP চালু করুন এবং alloydbIpType=PUBLIC পাস করুন।

৭. অপ্রয়োজনীয়গুলি মুছুন

আপনার Google Cloud অ্যাকাউন্টে অপ্রয়োজনীয় চার্জ এড়াতে এবং এই কোডল্যাব চলাকালীন তৈরি করা IAM পরিচয় মুছে ফেলতে, নিচে উল্লেখ করা রিসোর্সগুলি মুছে দিন।

১. AlloyDB IAM ডেটাবেস ব্যবহারকারী এবং পরিষেবা অ্যাকাউন্ট সরান

আপনার AlloyDB ক্লাস্টার থেকে IAM ডেটাবেস ব্যবহারকারীকে মুছে দিন এবং পরিষেবা অ্যাকাউন্ট সরিয়ে দিন:

# Delete the IAM database user from AlloyDB
gcloud alloydb users delete "java-alloydb-connector@${PROJECT_ID}.iam" \
    --cluster="${CLUSTER_ID}" \
    --region="${REGION}" \
    --project="${PROJECT_ID}" \
    --quiet

# Remove IAM policy bindings
gcloud projects remove-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:java-alloydb-connector@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/alloydb.client"

gcloud projects remove-iam-policy-binding "${PROJECT_ID}" \
    --member="serviceAccount:java-alloydb-connector@${PROJECT_ID}.iam.gserviceaccount.com" \
    --role="roles/serviceusage.serviceUsageConsumer"

# Delete the Service Account
gcloud iam service-accounts delete \
    "java-alloydb-connector@${PROJECT_ID}.iam.gserviceaccount.com" \
    --project="${PROJECT_ID}" \
    --quiet

২. স্থানীয় অ্যাপ্লিকেশন ডিফল্ট ক্রেডেনশিয়াল রিসেট করুন

আপনি যদি স্থানীয় ADC ইমপার্সোনেশন কনফিগার করে থাকেন, তাহলে আপনার স্থানীয় ক্রেডেনশিয়াল ডিফল্ট ব্যবহারকারীর পরিচয়ে রিসেট করুন:

gcloud auth application-default login

৩. (ঐচ্ছিক) AlloyDB ক্লাস্টার মুছে দিন

gcloud alloydb clusters delete "${CLUSTER_ID}" \
    --region="${REGION}" \
    --project="${PROJECT_ID}" \
    --force \
    --quiet

৮. অভিনন্দন

আপনি কোডল্যাব সম্পূর্ণ করেছেন এবং Java থেকে AlloyDB for PostgreSQL-এ সুরক্ষিত, পাসওয়ার্ডহীন কানেক্টিভিটি সেট-আপ করেছেন!

আপনি যা অর্জন করেছেন

  1. কনফিগার করা IAM ডেটাবেস যাচাইকরণ: ন্যূনতম-প্রিভিলেজ সার্ভিস অ্যাকাউন্ট তৈরি করা, alloydb.iam_authentication=on চালু করা, AlloyDB ক্লাস্টারে IAM ব্যবহারকারী রেজিস্টার করা এবং PostgreSQL টেবিল প্রিভিলেজ প্রদান করা।
  2. Plain JDBC ও HikariCP-এর সাথে কানেক্ট করা হয়েছে: অটোমেটিক mTLS 1.3 এনক্রিপশন, IAM টোকেন রিফ্রেশ ও ডায়নামিক IP রেজোলিউশনের জন্য com.google.cloud.alloydb.SocketFactory-এর সাথে HikariConfig কনফিগার করা হয়েছে।
  3. ইন্টিগ্রেটেড ক্লাউড-নেটিভ ফ্রেমওয়ার্ক: কোনও কাস্টম কানেকশন-পুল বয়লারপ্লেট ছাড়াই Spring Boot, Quarkus (Agroal) এবং Micronaut (HikariCP) কনফিগার করা হয়েছে, সাথে GraalVM নেটিভ ইমেজ-এর জন্য রিফ্লেকশন হিন্ট।
  4. IAM সংক্রান্ত সমস্যার সমাধান করার বিষয়ে দক্ষ: ব্যবহারকারীর নামের ফর্ম্যাটিং, ADC ইমপার্সোনেশন ও VPC রাউটিং সংক্রান্ত সমস্যা কীভাবে ডায়াগনসিস করতে হয় তা শিখেছেন।

আরও জানুন