ブロックチェーンっぽいこと、AWSでやってみた ── 非改ざん証明をS3 × DynamoDBで再現
背景:「改ざんは防止したい」、けどブロックチェーンはオーバースペック?
「データ改ざんを防ぎたい」
この課題は監査や電子契約、法令遵守といった分野で度々テーマとなります。
しかしながら、改ざん防止のためにブロックチェーンをプロジェクトの初期フェーズで導入するのはコスト・運用面でのハードルが高く、PoCの段階で頓挫するケースも少なくありません。
私自身、何度も「もっとシンプルにやれないのか、本当にブロックチェーンでないと実現できないのか?」と思っていました。
本記事では、「最小構成での実現可能性」を確認することを目的とした検証を行った際の“最小構成”を抜粋して紹介しています。
ブロックチェーンの使用を比較・検討する際の懸念としては以下のようなものが多いです。
- 専門知識の習得コストが高い
- パブリックチェーンの場合、トランザクションコストや速度の問題がある
- 小規模案件では過剰な設計になる
そこで今回は、AWSのS3とDynamoDBを使って「軽量な改ざん防止構成」を試してみた際の話をまとめてみました。
非改ざん性が求められる場面とは?
以下のようなユースケースで非改ざん証明が必要になることが多いです。
- ユーザーがアップロードしたデータの真正性確認
- IoTデータのログ改ざん防止
- 外部API連携データの証明履歴
- 公的機関への提出ドキュメントの監査ログ
こうした場面では「履歴の削除・改ざんができない」こと、「改ざんの痕跡がすぐわかる」ことが重視されます。
アーキテクチャ: S3+DynamoDBによる改ざん防止構成
本構成は、商用構成の設計検討から導き出したミニマム実装です。
商用ではAPI Gateway → Lambda → SQSキューによる非同期実行、IAMロールベースの権限制御なども設計しましたが、本稿ではPoC段階に適した以下の構成を扱います。
実装例:
LambdaでS3オブジェクト保存時にハッシュ値を計算し、DynamoDBに記録します。
以下はそのpython実装例です。
import boto3
import hashlib
ddb = boto3.resource('dynamodb')
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
version_id = event['Records'][0]['s3']['object'].get('versionId')
obj = s3.get_object(Bucket=bucket, Key=key, VersionId=version_id)
data = obj['Body'].read()
sha256_hash = hashlib.sha256(data).hexdigest()
table = ddb.Table('ImmutabilityLog')
previous_hash = get_previous_hash(table)
table.put_item(Item={
'object_id': key,
'version_id': version_id,
'sha256': sha256_hash,
'timestamp': obj['LastModified'].isoformat(),
'previous_hash': previous_hash
})
※ get_previous_hash
は直近のレコードの sha256
を返す関数です(省略)。
改ざん検知のLambda実装例:
イベント実行するLambdaでDynamoDBのレコードをチェーン順に走査し、 previous_hash
と前レコードの sha256
にズレがあればSNS等で通知します。
# 簡易イメージ
def validate_chain(records):
for i in range(1, len(records)):
if records[i]['previous_hash'] != records[i-1]['sha256']:
notify_issue(records[i]['object_id'])
課題・留意事項:
この構成はシンプルで始めやすいですが、以下の点には注意が必要です。
- S3ストレージ量が急増するリスク
- DynamoDBのスループットと課金設計(WCU/RCU管理)
- IAMで書き込み権限を最小化しCloudTrailで監査ログを残す
- ハッシュチェーンを壊されないよう、DBへの書き込みを制限する
まとめ: 小さく始めるトラストの担保
PoCや予算の限られているプロジェクトにおいては、いきなり商用レベルのアーキテクチャを構築するのは現実的ではありません。
本記事で紹介したのは、そうした制約の中でも "小さく試せる構成から概念を形にする" ことを目的とした最小構成です。
「ブロックチェーンを使わずに改ざん防止を実現できないか?」という問いに対して、S3とDynamoDBを用いたこの構成を、「トラスト--信頼性を担保可能な現実的かつ手の届きやすい選択肢の1つ」としてご紹介させていただきました。
ご高覧のほど、ありがとうございます。
Discussion