Amazon Redshift編~Unloadパート②~

こんにちは! JQです。

前回は『 Amazon Redshift編~Unloadパート①~ 』ということで、RedshiftからS3に外部出力してみました。

今回は『Amazon Redshift編~Unloadパート②~』と題して、Redshiftから暗号化してS3に外部出力してみたいと思います。

**

暗号化してS3へ外部出力

**

暗号化してS3に外部出力

1. S3へ暗号化して外部出力をしてみましょう!

暗号化にはBase64でEncodeしたAES 256bit keyが必要になります。

前回のスクリプトにKey部分の処理とunloadクエリーの最後に「encrypted」を追記します。

**※ AWSACCESSKEY等は環境に合わせて変更して下さい。

※ 復号化にはpasswordとsaltが必要になります。**

1#!/usr/bin/env ruby23require 'rubygems'4require 'aws-sdk'5require "dbi"67cluster_identifier = "dev"89redshift = AWS:: Redshift.new(10        :redshift_endpoint => "redshift.ap-northeast-1.amazonaws.com",11        :access_key_id => 'xxxxxxxxxxxx',12        :secret_access_key => 'xxxxxxxxxxxxxxx'13)1415client = redshift.client1617cluster = client.describe_clusters(18                :cluster_identifier => cluster_identifier19).clusters[0]2021dbuser=cluster.master_username2223dburl="DBI:Pg:dbname=#{cluster.db_name};host=#{cluster.endpoint.address};port=#{cluster.endpoint.port}"24dbpassword = "パスワード"25AWS_ACCESS_KEY=””26AWS_SECRET_ACCESS_KEY=””2728s3bucket="出力先S3バケット名"29pass="password"30salt=OpenSSL::Random.random_bytes(8)31puts salt3233enc=OpenSSL::Cipher.new("AES-256-ECB")34enc.encrypt35key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, enc.key_len + enc.iv_len)36key = key_iv[0, enc.key_len]37my_key = Base64.encode64(key)3839begin40        db=DBI.connect(dburl,dbuser,dbpassword)41rescue DBI::DatabaseError => e42        puts "rescue"43        puts "Error code: #{e.err}"44        puts "Error message: #{e.errstr}"45end4647db.do("48        unload ('select * from dev')49        to 's3://#{s3bucket}/resshift_dev/enc_'5051        credentials 'aws_access_key_id= AWS_ACCESS_KEY;aws_secret_access_key= AWS_SECRET_ACCESS_KEY ;master_symmetric_key=#{my_key}' encrypted52")5354db.disconnect

確認

2. 次に、出力結果の確認をしてみましょう!

該当のS3バケット下に「resshiftdev/enc」でファイルが作成されているかと思います。

出力先のS3バケット直下

上記のフォルダの中に出力結果のファイルがあります。

出力結果ファイル一覧

作成されたファイル中身は次になります。

暗号化されているのがわかります。

出力結果ファイル一覧
複合

3.復号化してインポートをしてみましょう!

復号化でも同様にCopyコマンドでencryptedオプションを利用して行います。

テーブルの中身を削除した状態で下記スクリプトを実行してみます。

1#!/usr/bin/env ruby23require 'rubygems'4require 'aws-sdk'5require "dbi"67cluster_identifier = "dev"89redshift = AWS:: Redshift.new(10:redshift_endpoint => "redshift.ap-northeast-1.amazonaws.com",11:access_key_id => 'xxxxxxxxxxxx',12:secret_access_key => 'xxxxxxxxxxxxxxx'13)1415client = redshift.client1617cluster = client.describe_clusters(18:cluster_identifier => cluster_identifier19).clusters[0]2021dbuser=cluster.master_username2223dburl="DBI:Pg:dbname=#{cluster.db_name};host=#{cluster.endpoint.address};port=#{cluster.endpoint.port}"24dbpassword = "パスワード"25AWS_ACCESS_KEY=””26AWS_SECRET_ACCESS_KEY=””2728s3bucket="出力先S3バケット名"29pass="password"30salt=”暗号化で作成されたsalt”3132enc=OpenSSL::Cipher.new("AES-256-ECB")33enc.encrypt34key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, enc.key_len + enc.iv_len)35key = key_iv[0, enc.key_len]36my_key = Base64.encode64(key)3738begin39db=DBI.connect(dburl,dbuser,dbpassword)40rescue DBI::DatabaseError => e41puts "rescue"42puts "Error code: #{e.err}"43puts "Error message: #{e.errstr}"44end4546db.do("47copy dev from 's3://#{s3bucket}/resshift_dev/enc_'4849credentials 'aws_access_key_id= AWS_ACCESS_KEY;aws_secret_access_key= AWS_SECRET_ACCESS_KEY ;master_symmetric_key=#{my_key}' encrypted50")5152res2=db.select_all("select * from dev")53puts res25455db.disconnect

成功すれば”select * from dev”の結果が出力されるかと思います。

いかがでしたでしょうか?

次回は『 Amazon Redshift編~Unloadパート③~ 』ということで、RedshiftからS3に出力するデータのフォーマットを変えてみたいと思いますので、お楽しみに!

——————————————————————————————————

ナレコムクラウドのFacebookに『いいね!』をクリックして頂くと

最新のお役立ちレシピが配信されます★

┏━━━━━━━━━━━━━┓

┃ナレコムクラウド Facebook┃

┗━━━━━━━━━━━━━┛

——————————————————————————————————

この記事を書いた人

aws-recipe-user