KMSとは
AWSでもおなじみ(?)のKMSですが、Alibaba CloudにもKMSが存在します。
今回は、KMSを使ってOSSのバケット内に存在する平文のファイルを暗号化して別のバケットにコピーしてみます。
このKMSによって従来、別のパソコンなどで作った暗号化キーを使って暗号化、復号化を行ってきました。
その場合、キーの管理や漏洩対策を行う必要がありました。KMSはキーの管理をクラウド業者に任せてこちらは
暗号化と復号化の処理だけを記載するだけに集中できるようになります。
1.KMSを作る
まずは、Keyをつくります。こちらは Key Management Systemで、作成します。特にこの部分については説明はよろしいかと思います。
2.OSSにバケットを作成してファイルを設置する
こちらも説明は不要かと思います。GUIでポチポチとバケットが作成できます。今回は、日付のフォルダーを作成してその中に複数のファイルを設置します。ディレクトリ構造としてはいかのような形
hirabun
└2019-04-01
└ file_01.txt
└ file_02.txt
└ file_03.txt
└2019-04-02
└ file_01.txt
└ file_02.txt
└ file_03.txt
3.SDKを使った暗号化
今回は、Function Computeを使います。下記はそのままコピペで使えるようにしました。
フォルダー名が今回は日付になっていますが、基本的に
START_DAY = datetime.strptime('2019-04-01', '%Y-%m-%d')
END_DAY = datetime.strptime('2019-04-02', '%Y-%m-%d')
の部分と
for date in daterange(START_DAY, END_DAY):
DATE_DIR = date.strftime("%Y-%m-%d")
の部分を変更すればいろんなディレクトリ名で使えます。
やっていることは単純で、ファイルを落として、上げるを繰り返しているだけです。
from datetime import datetime
import oss2
from datetime import timedelta
from oss2.crypto import AliKMSProvider
import tempfile
## 下記は個人の環境で書き直してください
REGION = "ap-northeast-1"
CMKID = "先程作成したCMKID"
OSS_ENDPOINT = "oss-ap-northeast-1-internal.aliyuncs.com"
ACCESSKEYID = "アクセスキー"
ACCESSKEYSECRET = "シークレットキー"
SOURCE_BUCKET_NAME = "hirabun"
DEST_BUCKET_NAME = "ango"
START_DAY = datetime.strptime('2019-04-01', '%Y-%m-%d')
END_DAY = datetime.strptime('2019-06-01', '%Y-%m-%d')
##ここからはお決まりの書き方
auth = oss2.Auth(ACCESSKEYID, ACCESSKEYSECRET)
bucket = oss2.Bucket(auth, OSS_ENDPOINT, SOURCE_BUCKET_NAME)
new_bucket = oss2.CryptoBucket(auth, OSS_ENDPOINT, DEST_BUCKET_NAME, crypto_provider=AliKMSProvider(ACCESSKEYID, ACCESSKEYSECRET, REGION, CMKID))
###ここまで##
def main():
for date in daterange(START_DAY, END_DAY):
DATE_DIR = date.strftime("%Y-%m-%d")
for obj in oss2.ObjectIterator(bucket, prefix=DATE_DIR):
##ファイルをローカルに落とす
with tempfile.TemporaryDirectory() as dname:
filepath = dname + "/" + obj.key.split('/')[1]
#OSSへのアップロード先(ディレクトリ名/ファイル名)
OSSKEY = DATE_DIR + "/" + obj.key.split('/')[1]
bucket.get_object_to_file(obj.key, filepath)
# ファイルアップロード
new_bucket.put_object_from_file(OSSKEY, filepath)
def daterange(_start, _end):
for n in range((_end - _start).days):
yield _start + timedelta(n)
Alibabaのドキュメントは、AWSに比べまだまだ整理されていなく、情報も散らばっているという個人的な感想で、
調べたいときに説明が足りなく苦労する部分が大きいです。