[アップデート]RedshiftがGlue Data Catalogを自動マウントするようになったので、Redshift Serverlessでクエリを試してみました

Redshiftへ自動マウントされるようになったGlue Data Catalogへ、Redshift query editor v2からテーブルの検索や情報の確認をしてみました。
2023.07.27

データアナリティクス事業本部の鈴木です。

RedshiftからGlue Data Catalogへの自動マウントの一般提供開始がアナウンスされたので、Redshift Serverlessで試してみました!

この記事の内容

下記のQuerying the AWS Glue Data Catalogにて紹介されているように、Amazon Redshift RA3ノードタイプクラスタおよびAmazon Redshift Serverlessが、Glue Data Catalogへのクエリをサポートしました。

今回は、ガイドに記載の内容を簡単にですが試してみました。

この機能を使うことで、S3バケットにあるデータへクエリするための外部スキーマが不要になります。

また、プレビュー版でApache Icebergテーブルへのクエリのサポートもアナウンスされており、データレイク側で新たにサポートしているテーブルフォーマットに対しても今後対応が進むことが期待されます。

やってみた

Redshift Serverlessインスタンスの作成

以下のテンプレートをデプロイして、Redshift Serverlessインスタンスを作成しました。

CloudFormationテンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: "Redshift Serverless and VPC"
Parameters:
  Env:
    Type: "String"
    Default: "test"
  ProjectName:
    Type: "String"
  CidrBlock:
    Description: Please type the CidrBlock.
    Type: String
    Default: 192.168.0.0/22
  BaseCapacity: 
    Type: Number
    Default: 8
  EnhancedVpcRouting: 
    Type: String
    AllowedValues:
      - true
      - false
    Default: false 
  PubliclyAccessible: 
    Type: String
    AllowedValues:
      - true
      - false
    Default: true
  AdminUsername:
    Type: String
    Default: awsuser
  AdminUserPassword:
    Type: String
    Description: Must be 8-64 characters long. Must contain at least one uppercase letter, one lowercase letter and one number. Can be any printable ASCII character except “/”, ““”, or “@”.
    NoEcho: true
    MinLength: 8
    MaxLength: 64

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Sub ${CidrBlock}
      EnableDnsSupport: True
      EnableDnsHostnames: True
      InstanceTenancy: default
      Tags:
      - Key: Name
        Value: !Sub ${ProjectName}-redshiftserverless-${Env}-VPC
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
      - Key: Network
        Value: Public
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    DependsOn: AttachGateway
    Properties:
      VpcId:
        Ref: VPC
      Tags:
      - Key: Name
        Value: !Sub |
          ${ProjectName}-redshiftserverless-${Env}-public-rtb
      - Key: Application
        Value:
          Ref: AWS::StackId
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId:
        Ref: PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: InternetGateway

  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      AvailabilityZone: !Select [ 0, !GetAZs ]
      CidrBlock: !Select [ 0, !Cidr [ !GetAtt VPC.CidrBlock, 4, 8 ]]
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      AvailabilityZone: !Select [ 1, !GetAZs ]
      CidrBlock: !Select [ 1, !Cidr [ !GetAtt VPC.CidrBlock, 4, 8 ]]
  Subnet3:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      AvailabilityZone: !Select [ 2, !GetAZs ]
      CidrBlock: !Select [ 2, !Cidr [ !GetAtt VPC.CidrBlock, 4, 8 ]]

  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: Subnet1
      RouteTableId:
        Ref: PublicRouteTable
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: Subnet2
      RouteTableId:
        Ref: PublicRouteTable
  Subnet3RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: Subnet3
      RouteTableId:
        Ref: PublicRouteTable
  RedshiftServerlessSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Marker security group for Application server.
      Tags:
      - Key: Name
        Value: !Sub |
          ${ProjectName}-redshiftserverless-${Env}-sg
  RedshiftServerlessRole:
    Type: "AWS::IAM::Role"
    Properties:
      Path: "/"
      RoleName: !Sub "${ProjectName}-${Env}-redshift-role"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - redshift.amazonaws.com
            Action: sts:AssumeRole
      MaxSessionDuration: 3600
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonAthenaFullAccess"
        - "arn:aws:iam::aws:policy/AmazonS3FullAccess"
        - "arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess"
        - "arn:aws:iam::aws:policy/AmazonRedshiftAllCommandsFullAccess"
      Description: "Allows Redshift clusters to call AWS services on your behalf."
      Tags:
        - Key: "Name"
          Value: !Sub "${ProjectName}-redshiftserverless-${Env}-redshift-role"
  RedshiftServerlessWorkGroup:
    Type: AWS::RedshiftServerless::Workgroup
    Properties: 
      WorkgroupName: !Sub "${ProjectName}-${Env}-redshift-wg"
      BaseCapacity: !Ref BaseCapacity
      EnhancedVpcRouting: !Ref EnhancedVpcRouting
      NamespaceName: !Ref RedshiftServerlessNamespace
      PubliclyAccessible: !Ref PubliclyAccessible
      SecurityGroupIds: 
        - !Ref RedshiftServerlessSecurityGroup
      SubnetIds: 
        - !Ref Subnet1
        - !Ref Subnet2
        - !Ref Subnet3
  RedshiftServerlessNamespace:
    Type: AWS::RedshiftServerless::Namespace
    Properties: 
      NamespaceName: !Sub "${ProjectName}-${Env}-redshift-ns"
      AdminUsername: !Ref AdminUsername
      AdminUserPassword: !Ref AdminUserPassword
      DbName: !Sub "${ProjectName}-db"
      IamRoles: 
        - !GetAtt RedshiftServerlessRole.Arn

過去のブログで使用しているテンプレートになります。

データベースへの接続

Redshift query editor v2で、Federated userにて接続しました。使用しているIAMユーザーはGlueデータカタログが確認できるものを使用しました。

データベースへの接続

このように、データベースの配下にawsdatacatalogが確認できました。

awsdatacatalogその1

開いてみると、確かにGlue Data Catalogの中身が確認できました。

現状はテーブルのみが見えるようでした。

Redshiftから見たサンプルのデータベース

サンプルのデータベース

※ 何回かRedshift query editor v2で更新してみましたたが、このままでした。

クエリの発行

ガイドを参考にいくつかクエリを発行してデータカタログのテーブルが検索できるか試してみました。

データの検索

Redshift query editor v2のクエリエディタから、以下のようにクエリを実行しました。

SELECT *
FROM awsdatacatalog.Glueデータベース名.Glueテーブル名

例えば以下のようになりました。

SELECTの結果

DataCatalogの確認

SHOWコマンドで以下を確認してみました。

  • Glueデータベース
  • Glueテーブル
  • Glueテーブルのカラム
SHOW SCHEMAS FROM DATABASE awsdatacatalog;

データベースの確認

SHOW TABLES FROM SCHEMA awsdatacatalog.myschema;

SHOW COLUMNS FROM TABLE awsdatacatalog.myglue.mytable;

カラムの確認

最後に

自動的にマウントされるようになったGlue Data Catalogへ、Redshift Serverlessから検索および定義の確認を試してみました。

ゆくゆくはデータレイク側のより新しいテーブルフォーマットと連携してより便利に利用できるようになることが楽しみですね。

ご興味がある方は、ぜひテンプレートを使ってRedshift Serverlessで試してみて頂ければと思います!