AWS Glueデータカタログへのテーブルの作成とAthenaの設定をCloudFormationでやってみた

2020.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

前回の以下記事では、AWS Glueデータカタログへのテーブルの作成とAthenaの設定をAWS CLIで行いました。

今回は、前回と同様の環境の構築をCloudFormationでやってみました。

やってみた

スタックテンプレート

CloudFormationスタックのテンプレートは以下となります。リソース名などを除き、これにより作成されるリソースのプロパティは前回と同じとなります。

% touch template.yml

template.yml

AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  Env:
    Type: String

Resources:
  RawDataBucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Sub raw-data-${AWS::AccountId}-${AWS::Region}-${Env}

  GlueDatabase:
    Type: AWS::Glue::Database
    Properties: 
      CatalogId: !Ref AWS::AccountId  
      DatabaseInput:
        Name: !Sub glue-database-${Env}

  GlueTable:
    Type: AWS::Glue::Table
    Properties:
      CatalogId: !Ref AWS::AccountId
      DatabaseName: !Ref GlueDatabase
      TableInput:
        Name: !Sub glue-table-${Env}
        TableType: EXTERNAL_TABLE
        Parameters:
          skip.header.line.count: 1
          has_encrypted_data: false
          serialization.encoding: utf-8
          EXTERNAL: true
        StorageDescriptor:
          OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
          Columns:
            - Name: rank
              Type: int
            - Name: name
              Type: string
            - Name: type
              Type: string
          InputFormat: org.apache.hadoop.mapred.TextInputFormat
          Location: !Sub s3://${RawDataBucket}/data
          SerdeInfo:
            Parameters:
              field.delim: ","
              serialization.format: ","
            SerializationLibrary: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  AthenaQueryResultBucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: !Sub query-result-${AWS::AccountId}-${AWS::Region}-${Env}

  AthenaWorkGroup:
    Type: AWS::Athena::WorkGroup
    Properties:
      Name: !Sub athena-work-group-${Env}
      WorkGroupConfiguration:
        ResultConfiguration:
          OutputLocation: !Sub s3://${AthenaQueryResultBucket}/data
        EnforceWorkGroupConfiguration: true
        PublishCloudWatchMetricsEnabled: true

テンプレート内では以下の5リソースを定義しています。

  • RawDataBucket:Glueのクロール対象のS3バケット
  • GlueDatabase:Glueデータベース
  • GlueTable:Glueがクロールしたデータを登録するデータカタログ
  • AthenaQueryResultBucket:Athenaでのクエリ実行結果の保存先バケット
  • AthenaWorkGroup:Athenaのワークグループ

スタックのデプロイ

% Env=dev
% aws cloudformation deploy \
--template-file template.yml \
--stack-name sample-analytyis-stack-${Env} \
--capabilities CAPABILITY_NAMED_IAM \
--no-fail-on-empty-changeset \
--parameter-overrides Env=${Env}

下記のように結果出力されればデプロイは成功です。

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - sample-analytyis-stack-dev

Athenaのクエリ実行によるデータ取得

デプロイした環境を利用して、Athenaのクエリ実行によるデータ取得をしてみます。

データ準備

% touch data.csv

data.csv

rank,name,type
1,hojo,Co
2,sagisawa,Co
3,ichinose,Cu
4,kamiya,Co
5,takagaki,Co
% aws s3 cp data.csv s3://<bucket-name>/data/data.csv

クエリ実行

% aws athena start-query-execution \
--query-string 'SELECT * FROM "glue-database-dev"."glue-table-dev" limit 10' \
--work-group athena-work-group-${Env}
{
    "QueryExecutionId": "5c3824ab-6b92-454b-99af-2cc94591b2a6"
}

クエリ実行結果取得

% aws athena get-query-results --query-execution-id 5c3824ab-6b92-454b-99af-2cc94591b2a6
{
    "ResultSet": {
        "Rows": [
            {
                "Data": [
                    {
                        "VarCharValue": "rank"
                    },
                    {
                        "VarCharValue": "name"
                    },
                    {
                        "VarCharValue": "attribute"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "1"
                    },
                    {
                        "VarCharValue": "hojo"
                    },
                    {
                        "VarCharValue": "Co"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "2"
                    },
                    {
                        "VarCharValue": "sagisawa"
                    },
                    {
                        "VarCharValue": "Co"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "3"
                    },
                    {
                        "VarCharValue": "ichinose"
                    },
                    {
                        "VarCharValue": "Cu"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "4"
                    },
                    {
                        "VarCharValue": "kamiya"
                    },
                    {
                        "VarCharValue": "Co"
                    }
                ]
            },
            {
                "Data": [
                    {
                        "VarCharValue": "5"
                    },
                    {
                        "VarCharValue": "takagaki"
                    },
                    {
                        "VarCharValue": "Co"
                    }
                ]
            }
        ],
        "ResultSetMetadata": <略>
    },
    "UpdateCount": 0
}

Athenaのクエリ実行によるデータ取得ができました。

おわりに

AWS Glueデータカタログへのテーブルの作成とAthenaの設定をCloudFormationでやってみました。

CloudFormationを使うことによってリソースの構成管理ができるようになるのは嬉しいですね。

参考

以上