こんにちは! JQです。
前回は『Amazon Redshift編~Unloadパート①~』ということで、RedshiftからS3に外部出力してみました。
今回は『Amazon Redshift編~Unloadパート②~』と題して、Redshiftから暗号化してS3に外部出力してみたいと思います。
暗号化してS3へ外部出力
暗号化してS3に外部出力
1. S3へ暗号化して外部出力をしてみましょう!
暗号化にはBase64でEncodeしたAES 256bit keyが必要になります。
前回のスクリプトにKey部分の処理とunloadクエリーの最後に「encrypted」を追記します。
※ AWS_ACCESS_KEY等は環境に合わせて変更して下さい。
※ 復号化にはpasswordとsaltが必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/usr/bin/env ruby require 'rubygems' require 'aws-sdk' require "dbi" cluster_identifier = "dev" redshift = AWS:: Redshift.new( :redshift_endpoint => "redshift.ap-northeast-1.amazonaws.com", :access_key_id => 'xxxxxxxxxxxx', :secret_access_key => 'xxxxxxxxxxxxxxx' ) client = redshift.client cluster = client.describe_clusters( :cluster_identifier => cluster_identifier ).clusters[0] dbuser=cluster.master_username dburl="DBI:Pg:dbname=#{cluster.db_name};host=#{cluster.endpoint.address};port=#{cluster.endpoint.port}" dbpassword = "パスワード" AWS_ACCESS_KEY=”” AWS_SECRET_ACCESS_KEY=”” s3bucket="出力先S3バケット名" pass="password" salt=OpenSSL::Random.random_bytes(8) puts salt enc=OpenSSL::Cipher.new("AES-256-ECB") enc.encrypt key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, enc.key_len + enc.iv_len) key = key_iv[0, enc.key_len] my_key = Base64.encode64(key) begin db=DBI.connect(dburl,dbuser,dbpassword) rescue DBI::DatabaseError => e puts "rescue" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" end db.do(" unload ('select * from dev') to 's3://#{s3bucket}/resshift_dev/enc_' credentials 'aws_access_key_id= AWS_ACCESS_KEY;aws_secret_access_key= AWS_SECRET_ACCESS_KEY ;master_symmetric_key=#{my_key}' encrypted ") db.disconnect |
確認
2. 次に、出力結果の確認をしてみましょう!
該当のS3バケット下に「resshift_dev/enc_」でファイルが作成されているかと思います。
上記のフォルダの中に出力結果のファイルがあります。
作成されたファイル中身は次になります。
暗号化されているのがわかります。
複合
3.復号化してインポートをしてみましょう!
復号化でも同様にCopyコマンドでencryptedオプションを利用して行います。
テーブルの中身を削除した状態で下記スクリプトを実行してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#!/usr/bin/env ruby require 'rubygems' require 'aws-sdk' require "dbi" cluster_identifier = "dev" redshift = AWS:: Redshift.new( :redshift_endpoint => "redshift.ap-northeast-1.amazonaws.com", :access_key_id => 'xxxxxxxxxxxx', :secret_access_key => 'xxxxxxxxxxxxxxx' ) client = redshift.client cluster = client.describe_clusters( :cluster_identifier => cluster_identifier ).clusters[0] dbuser=cluster.master_username dburl="DBI:Pg:dbname=#{cluster.db_name};host=#{cluster.endpoint.address};port=#{cluster.endpoint.port}" dbpassword = "パスワード" AWS_ACCESS_KEY=”” AWS_SECRET_ACCESS_KEY=”” s3bucket="出力先S3バケット名" pass="password" salt=”暗号化で作成されたsalt” enc=OpenSSL::Cipher.new("AES-256-ECB") enc.encrypt key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, 2000, enc.key_len + enc.iv_len) key = key_iv[0, enc.key_len] my_key = Base64.encode64(key) begin db=DBI.connect(dburl,dbuser,dbpassword) rescue DBI::DatabaseError => e puts "rescue" puts "Error code: #{e.err}" puts "Error message: #{e.errstr}" end db.do(" copy dev from 's3://#{s3bucket}/resshift_dev/enc_' credentials 'aws_access_key_id= AWS_ACCESS_KEY;aws_secret_access_key= AWS_SECRET_ACCESS_KEY ;master_symmetric_key=#{my_key}' encrypted ") res2=db.select_all("select * from dev") puts res2 db.disconnect |
成功すれば”select * from dev”の結果が出力されるかと思います。
いかがでしたでしょうか?
次回は『Amazon Redshift編~Unloadパート③~』ということで、RedshiftからS3に出力するデータのフォーマットを変えてみたいと思いますので、お楽しみに!
——————————————————————————————————
ナレコムクラウドのFacebookに『いいね!』をクリックして頂くと
最新のお役立ちレシピが配信されます★
┏━━━━━━━━━━━━━┓
┃ナレコムクラウド Facebook┃
┗━━━━━━━━━━━━━┛
——————————————————————————————————