AWS

マルチAZのRedshiftクラスターをCDKで実装する

redshift-multi-az-cluster
maachan

Amazon RedshiftのマルチAZは、約1年前の2023年11月1日に一般提供が開始されました。

Amazon Redshift マルチ AZ が RA3 クラスター向けに一般提供開始

比較的新しい機能ということもあり、いくつか制約とCDKで実装する際のハマリポイントがあったため、備忘録として残します。

マルチAZの制約

CDKで新規にマルチAZのRedshiftクラスターを構築する際に留意すべきポイントは以下です。

  • RA3インスタンスタイプのみサポート
  • 暗号化必須
  • 二つ以上のノード必須
  • 3AZのサブネット必須

RDSサブネットグループは2AZ以上ですが、Redshiftのサブネットグループの場合、3AZのサブネットを指定してあげる必要があるので留意が必要です。

具体的な制約は以下公式ドキュメントをご参照ください。

Setting up Multi-AZ deployment - Limitations

マルチAZ時の最低コスト

上記制約から、マルチAZで構築する場合、RA3インスタンスタイプで2ノード*2AZ=4ノードが必要となります。

直近の2024年10月1日にRA3系の最小インスタンスであるRA3.largeがリリースされましたが、最小インスタンスを使用する場合でも、コストに留意する必要があります。

Amazon Redshift が RA3.large インスタンスをリリース
https://aws.amazon.com/jp/about-aws/whats-new/2024/10/amazon-redshift-ra3-large/

下記の通り、見積もりが$1,865.88/月となります。
redshift-multi-az

CDKでマルチAZのRedshiftクラスターを構築

制約を加味すると以下のような実装になります。

import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import * as redshift from "aws-cdk-lib/aws-redshift";
import * as ec2 from "aws-cdk-lib/aws-ec2";

export class RedshiftMultiAzStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        // Redshift用のVPCを作成
        const vpc = new ec2.Vpc(this, "RedshiftVPC", {
            maxAzs: 3, // 3AZのサブネット必須
            natGateways: 0,
            subnetConfiguration: [
                {
                    cidrMask: 24,
                    name: "private-isolated",
                    subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
                },
            ],
        });

        // Redshift用のセキュリティグループを作成
        const securityGroup = new ec2.SecurityGroup(
            this,
            "RedshiftSecurityGroup",
            {
                vpc: vpc,
                description: "Security group for Redshift cluster",
                allowAllOutbound: true,
            }
        );

        // ポート5439(Redshiftのデフォルトポート)へのインバウンド許可
        securityGroup.addIngressRule(
            ec2.Peer.anyIpv4(), // 本番環境では絞ることを推奨
            ec2.Port.tcp(5439),
            "Allow Redshift access"
        );

        // Redshift用のサブネットグループを作成
        const subnetGroup = new redshift.CfnClusterSubnetGroup(
            this,
            "RedshiftSubnetGroup",
            {
                description: "Subnet group for Redshift cluster",
                subnetIds: vpc.selectSubnets({
                    subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
                }).subnetIds,
            }
        );

        // Redshiftクラスターを作成
        new redshift.CfnCluster(this, "RedshiftCluster", {
            multiAz: true,
            encrypted: true, // 暗号化必須
            clusterType: "multi-node",
            nodeType: "ra3.large", // RA3インスタンスタイプのみサポート
            numberOfNodes: 2, // 二つ以上のノード必須
            masterUsername: "admin",
            masterUserPassword: "AdminPassword123", // 実運用ではSecrets Managerの使用を推奨
            dbName: "multiazdb",
            clusterSubnetGroupName: subnetGroup.ref, // 3AZのサブネット必須
            vpcSecurityGroupIds: [securityGroup.securityGroupId],
            publiclyAccessible: false,
        });
    }
}

CDKで3AZを実装する際のハマりポイント

下記AWS CDK Referenceに記載されているように、3AZ以上を作成する場合は、accountとregionを指定してあげる必要があります。

https://docs.aws.amazon.com/cdk/api/v1/docs/@aws-cdk_aws-ec2.Vpc.html#maxazs
Be aware that environment-agnostic stacks will be created with access to only 2 AZs, so to use more than 2 AZs, be sure to specify the account and region on your stack.

そのため、以下のようにenvを追加する必要があります。

#!/usr/bin/env node
import "source-map-support/register";
import * as cdk from "aws-cdk-lib";
import { RedshiftMultiAzStack } from "../lib/redshift-multi-az-stack";

const app = new cdk.App();

const env = {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: process.env.CDK_DEFAULT_REGION,
};

new RedshiftMultiAzStack(app, "RedshiftMultiAzStack", { env });

まとめ

DC2インスタンスタイプからマルチAZに移行する場合はコストが跳ね上がり、気軽にマルチAZ化できないので留意しましょう。

AUTHOR
maachan
maachan
記事URLをコピーしました