この記事は公開されてから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を使うことによってリソースの構成管理ができるようになるのは嬉しいですね。
参考
- AWS::S3::Bucket - AWS CloudFormation
- AWS CloudFormation テンプレートを使用したデータカタログの事前設定 - AWS Glue
- AWS Glueデータカタログへのテーブルの作成とAthenaでのクエリ実行をAWS CLIでやってみた | Developers.IO
- AWS::Glue::Database - AWS CloudFormation
以上