⛓️

ブロックチェーンっぽいこと、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つ」としてご紹介させていただきました。

ご高覧のほど、ありがとうございます。

dotD Tech Blog

Discussion