17_zibunyo

```
const { execSync } = require('child_process');
const AWS = require('aws-sdk');
const fs = require('fs');

// Pandocのバイナリパス
const pandocBinary = '/opt/bin/pandoc'; // バイナリのパスに修正してください

exports.handler = async (event, context) => {
  const s3Client = new AWS.S3();

  // S3バケットとファイル情報を取得
  const record = event.Records[0];
  const inputBucket = record.s3.bucket.name;
  const inputKey = record.s3.object.key;
  const outputBucket = 's3-nodejs-pandoc-bucket'; // 変換後のHTMLファイルの出力先バケット名
  const outputKey = 'output.html'; // 変換後のHTMLファイルのキー

  // Markdownファイルを一時的なローカルファイルにダウンロード
  const tempInputFile = '/tmp/input.yaml';
  const downloadParams = {
    Bucket: inputBucket,
    Key: inputKey,
  };

  try {
    const data = await s3Client.getObject(downloadParams).promise();
    fs.writeFileSync(tempInputFile, data.Body);

    // Pandocのコマンドを構築
    const tempOutputFile = '/tmp/output.html';
    const pandocCommand = [
      pandocBinary,
      '-t', 'html',
      '-o', tempOutputFile,
      tempInputFile,
    ];

    // Pandocを実行
    execSync(pandocCommand.join(' '));

    // 変換後のHTMLファイルをS3にアップロード
    const uploadParams = {
      Bucket: outputBucket,
      Key: outputKey,
      Body: fs.readFileSync(tempOutputFile),
    };

    await s3Client.upload(uploadParams).promise();
    console.log('Conversion completed successfully.');
    return 'Conversion completed successfully.';
  } catch (error) {
    console.error('Conversion failed. Error:', error);
    throw error;
  }
};
```


```
title: "Sample Document"
author: "John Doe"
date: "2023-07-24"
content: |
  This is a sample document written in **Markdown** format.

  # aaa
  
  ## bbb

  # Heading 1
  Lorem ipsum dolor sit amet, consectetur adipiscing elit.

  ## Heading 2
  Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

  ### Heading 3
  Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
```

```
wget https://github.com/jgm/pandoc/releases/download/2.17.1.1/pandoc-2.17.1.1-linux-amd64.tar.gz
tar -xzvf pandoc-2.17.1.1-linux-amd64.tar.gz
zip -r pandoc-layer.zip ./bin
```

```
const AWS = require('aws-sdk');
const fs = require('fs');

// Pandocのバイナリパス
const pandocBinary = '/opt/bin/pandoc'; // バイナリのパスに修正してください

exports.handler = async (event, context) => {
  const s3Client = new AWS.S3();

  // S3バケットとファイル情報を取得
  const record = event.Records[0];
  const inputBucket = record.s3.bucket.name;
  const inputKey = record.s3.object.key;
  const templateKey = 'templates/base_template.html';
  const tempInputFile = '/tmp/input.md';
  const tempTemplateFile = '/tmp/template.html';

  try {
    // Markdownファイルを一時的なローカルファイルにダウンロード
    const downloadInputParams = {
      Bucket: inputBucket,
      Key: inputKey,
    };
    await s3Client.download(downloadInputParams).promise();
    fs.renameSync(inputKey, tempInputFile);

    // テンプレートファイルを一時的なローカルファイルにダウンロード
    const downloadTemplateParams = {
      Bucket: inputBucket,
      Key: templateKey,
    };
    await s3Client.download(downloadTemplateParams).promise();
    fs.renameSync(templateKey, tempTemplateFile);

    // Pandocのコマンドを構築
    const tempOutputFile = '/tmp/output.html';
    const pandocCommand = [
      pandocBinary,
      '-f', 'markdown',
      '--template', tempTemplateFile, // テンプレートファイルを指定
      '-o', tempOutputFile,
      tempInputFile,
    ];

    // Pandocを実行
    const { status, stdout, stderr } = await execShellCommand(pandocCommand.join(' '));

    if (status === 0) {
      // 変換後のHTMLファイルをS3にアップロード
      const outputBucket = 's3-lambda-pandoc'; // 変換後のHTMLファイルの出力先バケット名
      const outputKey = 'output.html'; // 変換後のHTMLファイルのキー
      const uploadParams = {
        Bucket: outputBucket,
        Key: outputKey,
        Body: fs.readFileSync(tempOutputFile),
      };
      await s3Client.upload(uploadParams).promise();
      console.log('Conversion completed successfully.');
      return 'Conversion completed successfully.';
    } else {
      console.error('Conversion failed. Error:', stderr);
      throw new Error('Conversion failed.');
    }
  } catch (error) {
    console.error('An error occurred:', error);
    throw error;
  }
};

function execShellCommand(cmd) {
  const { exec } = require('child_process');
  return new Promise((resolve, reject) => {
    exec(cmd, (error, stdout, stderr) => {
      if (error) {
        reject(error);
      }
      resolve({ status: 0, stdout, stderr });
    });
  });
}

```