Skip to content
takke1986Public

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

36 Commits

Folders and files

Repository files navigation

PPTX to PDF Converter

AWS S3にアップロードされた.pptxおよび.pptファイルを自動的にPDFに変換するサーバーレスアプリケーションです。

概要

このプロジェクトは、AWS CDKを使用して以下のAWSリソースを構築します:

  • S3バケット: PowerPointファイルのアップロード先
  • Lambda関数: LibreOfficeを使用してPPTX/PPTファイルをPDFに変換
  • EventBridge: .pptx/.pptファイルのアップロード時のみLambda関数を自動トリガー

アーキテクチャ

  1. ユーザーが.pptxまたは.pptファイルをS3バケットにアップロード
  2. S3がEventBridgeにイベントを送信
  3. EventBridgeが.pptx/.pptファイルのみをフィルタリングしてLambda関数をトリガー
  4. Lambda関数がファイルをダウンロードし、LibreOfficeを使用してPDFに変換
  5. 変換されたPDFファイルを同じフォルダにアップロード

重要: EventBridgeのフィルタリング機能により、.pdfファイルのアップロードではLambda関数がトリガーされないため、無限ループを防止しています。

前提条件

  • Node.js 18以上
  • AWS CLI(設定済み)
  • AWS CDK CLI
  • Docker(Lambda関数のビルドに必要)

インストール

# 依存関係をインストール
npm install

# CDK CLIをグローバルにインストール(未インストールの場合)
npm install -g aws-cdk

デプロイ

# CDKスタックをAWSにデプロイ
npm run deploy

# 初回デプロイ時はブートストラップが必要な場合があります
cdk bootstrap

デプロイが完了すると、以下の情報が出力されます:

  • S3バケット名
  • S3バケットURL
  • Lambda関数名
  • EventBridgeルール名

使い方

1. ファイルをアップロード

PowerPointファイルをS3バケットの任意の場所にアップロードしてください。

# AWS CLIでファイルをアップロード
aws s3 cp presentation.pptx s3://your-bucket-name/

# サブフォルダを使用する場合
aws s3 cp presentation.pptx s3://your-bucket-name/2024/january/

2. PDFファイルを確認

数秒後、同じフォルダに変換されたPDFが作成されます。

# 変換されたPDFをダウンロード
aws s3 cp s3://your-bucket-name/presentation.pdf .

# サブフォルダを使用した場合
aws s3 cp s3://your-bucket-name/2024/january/presentation.pdf .

フォルダ構造の例

# アップロード前
s3://your-bucket-name/
└── (空)

# presentation.pptxをアップロード
s3://your-bucket-name/
└── presentation.pptx

# 変換完了後(元のファイルは削除されPDFに置き換わります)
s3://your-bucket-name/
└── presentation.pdf

動作の仕組み

  • EventBridgeは.pptxと.pptで終わるファイルのみをトリガー
  • .pdfファイルはトリガーされないため、無限ループは発生しません
  • 変換後のPDFが同じ場所に保存され、元のPPTX/PPTファイルは自動的に削除されます

ファイル構成

.
├── bin/
│   └── pptx-to-pdf.ts          # CDKアプリのエントリーポイント
├── lib/
│   └── pptx-to-pdf-stack.ts    # CDKスタック定義
├── lambda-docker/
│   ├── Dockerfile              # Lambda用のDockerイメージ
│   ├── index.js                # Lambda関数のコード
│   └── package.json            # Lambda関数の依存関係
├── cdk.json                    # CDK設定ファイル
├── package.json                # プロジェクトの依存関係
└── tsconfig.json               # TypeScript設定

Lambda関数の詳細

Lambda関数は以下の処理を実行します:

  1. EventBridgeイベントからバケット名とオブジェクトキーを取得
  2. .pptxまたは.ppt拡張子を確認
  3. S3からファイルをダウンロード
  4. LibreOfficeを使用してPDFに変換
  5. 変換されたPDFを同じフォルダにアップロード
  6. 元のPPTX/PPTファイルを削除
  7. 一時ファイルをクリーンアップ

カスタマイズ

メモリとタイムアウトの調整

lib/pptx-to-pdf-stack.tsで以下の値を調整できます:

memorySize: 2048,  // メモリサイズ(MB)
timeout: cdk.Duration.minutes(5),  // タイムアウト

バケット設定

S3バケットの設定はlib/pptx-to-pdf-stack.tsで変更できます:

const bucket = new s3.Bucket(this, 'PptxToPdfBucket', {
  // カスタマイズ可能なオプション
  versioned: true,  // バージョニングを有効化
  encryption: s3.BucketEncryption.S3_MANAGED,
  // その他のオプション...
});

コスト

このソリューションの主なコストは以下の通りです:

  • S3ストレージ: アップロードされたファイルのストレージコスト
  • Lambda実行: 実行時間とメモリ使用量に基づく
  • データ転送: S3からLambdaへのデータ転送(通常は無料)

小規模な使用であれば、AWS無料利用枠内で運用可能です。

トラブルシューティング

Lambda関数がタイムアウトする

大きなファイルの場合、タイムアウト時間を増やしてください:

timeout: cdk.Duration.minutes(10)

メモリ不足エラー

メモリサイズを増やしてください:

memorySize: 3008  // 最大10,240 MB

変換が失敗する

Lambda関数のログをCloudWatch Logsで確認してください:

aws logs tail /aws/lambda/your-function-name --follow

実験用コマンド

開発・テスト時に便利なコマンド集です。

デプロイ関連

# スタックをデプロイ
npm run deploy

# スタックを削除
npm run destroy

# CloudFormationテンプレートを生成(デプロイせずに確認)
npm run synth

# デプロイ前の差分を確認
cdk diff

S3操作

# バケット名を環境変数に設定(デプロイ後の出力から取得)
export BUCKET_NAME="your-bucket-name"

# テストファイルをアップロード
aws s3 cp test.pptx s3://$BUCKET_NAME/

# バケット内のファイル一覧を表示
aws s3 ls s3://$BUCKET_NAME/

# 特定のファイルを確認
aws s3 ls s3://$BUCKET_NAME/ --human-readable --summarize

# PDFファイルをダウンロード
aws s3 cp s3://$BUCKET_NAME/test.pdf ./downloaded.pdf

# バケット内の全ファイルを削除(注意!)
aws s3 rm s3://$BUCKET_NAME/ --recursive

Lambda関数の確認

# Lambda関数名を環境変数に設定
export LAMBDA_NAME=$(aws cloudformation describe-stacks \
  --stack-name PptxToPdfStack \
  --query 'Stacks[0].Outputs[?OutputKey==`LambdaFunctionName`].OutputValue' \
  --output text)

# Lambda関数の情報を表示
aws lambda get-function --function-name $LAMBDA_NAME

# 最新のログを確認
aws logs tail /aws/lambda/$LAMBDA_NAME --follow

# 直近10分間のログを表示
aws logs tail /aws/lambda/$LAMBDA_NAME --since 10m

# エラーログのみをフィルタリング
aws logs tail /aws/lambda/$LAMBDA_NAME --filter-pattern "ERROR"

EventBridgeルールの確認

# EventBridgeルール名を取得
export RULE_NAME=$(aws cloudformation describe-stacks \
  --stack-name PptxToPdfStack \
  --query 'Stacks[0].Outputs[?OutputKey==`EventBridgeRuleName`].OutputValue' \
  --output text)

# ルールの詳細を表示
aws events describe-rule --name $RULE_NAME

# ルールのターゲットを表示
aws events list-targets-by-rule --rule $RULE_NAME

テストシナリオ

# 1. 単一ファイルのテスト
echo "test.pptx をアップロード..."
aws s3 cp test.pptx s3://$BUCKET_NAME/
sleep 10
echo "変換結果を確認..."
aws s3 ls s3://$BUCKET_NAME/

# 2. サブフォルダのテスト
echo "サブフォルダにファイルをアップロード..."
aws s3 cp test.pptx s3://$BUCKET_NAME/folder1/folder2/test.pptx
sleep 10
aws s3 ls s3://$BUCKET_NAME/folder1/folder2/

# 3. 複数ファイルの同時変換テスト
echo "複数ファイルをアップロード..."
for i in {1..5}; do
  aws s3 cp test.pptx s3://$BUCKET_NAME/test-$i.pptx
done
sleep 30
aws s3 ls s3://$BUCKET_NAME/

# 4. ログをリアルタイム監視しながらテスト
aws logs tail /aws/lambda/$LAMBDA_NAME --follow &
aws s3 cp test.pptx s3://$BUCKET_NAME/monitored-test.pptx

デバッグ用コマンド

# CloudWatch Logsのロググループ一覧
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/

# 最新のログストリームを取得
aws logs describe-log-streams \
  --log-group-name /aws/lambda/$LAMBDA_NAME \
  --order-by LastEventTime \
  --descending \
  --max-items 1

# S3イベント通知の設定を確認
aws s3api get-bucket-notification-configuration --bucket $BUCKET_NAME

# Lambda関数の環境変数を確認
aws lambda get-function-configuration \
  --function-name $LAMBDA_NAME \
  --query 'Environment'

クリーンアップ

リソースを削除するには:

npm run destroy

ライセンス

MIT

参考資料

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages