こんにちは! 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」でファイルが作成されているかと思います。
上記のフォルダの中に出力結果のファイルがあります。
作成されたファイル中身は次になります。
暗号化されているのがわかります。
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に『いいね!』をクリックして頂くと
最新のお役立ちレシピが配信されます★
——————————————————————————————————