AWS S3にアップロードされた.pptxおよび.pptファイルを自動的にPDFに変換するサーバーレスアプリケーションです。
このプロジェクトは、AWS CDKを使用して以下のAWSリソースを構築します:
- S3バケット: PowerPointファイルのアップロード先
- Lambda関数: LibreOfficeを使用してPPTX/PPTファイルをPDFに変換
- EventBridge: .pptx/.pptファイルのアップロード時のみLambda関数を自動トリガー
- ユーザーが.pptxまたは.pptファイルをS3バケットにアップロード
- S3がEventBridgeにイベントを送信
- EventBridgeが.pptx/.pptファイルのみをフィルタリングしてLambda関数をトリガー
- Lambda関数がファイルをダウンロードし、LibreOfficeを使用してPDFに変換
- 変換された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ルール名
PowerPointファイルをS3バケットの任意の場所にアップロードしてください。
# AWS CLIでファイルをアップロード
aws s3 cp presentation.pptx s3://your-bucket-name/
# サブフォルダを使用する場合
aws s3 cp presentation.pptx s3://your-bucket-name/2024/january/数秒後、同じフォルダに変換された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関数は以下の処理を実行します:
- EventBridgeイベントからバケット名とオブジェクトキーを取得
- .pptxまたは.ppt拡張子を確認
- S3からファイルをダウンロード
- LibreOfficeを使用してPDFに変換
- 変換されたPDFを同じフォルダにアップロード
- 元のPPTX/PPTファイルを削除
- 一時ファイルをクリーンアップ
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無料利用枠内で運用可能です。
大きなファイルの場合、タイムアウト時間を増やしてください:
timeout: cdk.Duration.minutes(10)メモリサイズを増やしてください:
memorySize: 3008 // 最大10,240 MBLambda関数のログをCloudWatch Logsで確認してください:
aws logs tail /aws/lambda/your-function-name --follow開発・テスト時に便利なコマンド集です。
# スタックをデプロイ
npm run deploy
# スタックを削除
npm run destroy
# CloudFormationテンプレートを生成(デプロイせずに確認)
npm run synth
# デプロイ前の差分を確認
cdk diff# バケット名を環境変数に設定(デプロイ後の出力から取得)
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関数名を環境変数に設定
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ルール名を取得
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 destroyMIT