AWS LambdaでExcelやPDFファイルを出力する

本記事では、AWS Lambdaで「DioDocs(ディオドック)」を使用した .NET CoreベースのLambda関数を作成し、ExcelやPDFファイルをAWS S3へ出力する方法について紹介します。

AWS Lambdaとは

AWS LambdaはAmazon Web Serviceで提供されている、各種イベントをトリガーに処理を実行するサーバーレスなクラウドサービスです。

AWS Lambdaは.NET Core 2.1をサポートしており、C#で .NET CoreベースのLambda関数を作成できます。今回はAWS Toolkit for Visual Studioを使用してVisual Studio 2019でLambda関数を作成し、デプロイして確認してみます。

AWS Toolkit for Visual Studioのセットアップ

AWS Toolkit for Visual Studioのインストールと、AWSの認証情報の設定は以下を参考にして準備しておきます。

AWS Toolkit for Visual Studio をセットアップする – AWS Toolkit for Visual Studio

AWS 認証情報を提供する – AWS Toolkit for Visual Studio

Lambda関数で実装する内容

今回実装する内容は非常にシンプルなモノです。まず、DioDocsを使用してExcelとPDFを作成します。その後、作成したExcelとPDFをAmazon S3に保存します。Amazon S3への保存にはAWS SDK for .NETを使用します。

Lambda関数の作成

以下のドキュメントを参考にLambda関数を作成していきます。

チュートリアル: AWS Toolkit for Visual Studio の AWS Lambda プロジェクトを使用する – AWS Toolkit for Visual Studio

Visual Studio 2019でプロジェクトテンプレート「AWS Lambda Project (.NET Core – C#)」を選択して「次へ」をクリックします。

プロジェクトテンプレート

プロジェクト名DDAWSLambda1を入力して「作成」をクリックします。

プロジェクトテンプレート

AWS Lambda Projectのテンプレートを選択します。Empty Functionを選択して「Finish」をクリックします。

AWS Lambda Projectのテンプレート

DDAWSLambda1プロジェクトが作成されます。

AWS Lambdaプロジェクト

NuGetパッケージの追加

Visual Studioの「NuGet パッケージ マネージャー」からAWS SDK for .NET(Amazon S3)AWSSDK.S3とDioDocsのパッケージGrapeCity.DioDocs.Excel.jaGrapeCity.DioDocs.Pdf.jaをインストールします。

NuGet パッケージ マネージャー

Amazon S3にバケットを作成

Amazon S3にDioDocsで作成したExcelとPDFの保存先になるバケットdiodocs-storage(このバケット名はユニークにする必要があるので、実際に試す際には命名規則に従った任意の名称に置き換えてください)を、Visual Studioの「AWS Explorer」から作成します。

Amazon S3にバケットを作成

DioDocsを使うクラスを追加

DioDocsでExcelファイルを作成するクラスDDExcel、PDFファイルを作成するクラスDDPdfを追加します。

DioDocsを使うクラスを追加

それぞれ、以下のコードを追加します。

using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using GrapeCity.Documents.Excel;
using System.IO;
:
:
class DDExcel
{
private const string bucketName = "diodocs-storage";
private const string uploadExcelName = "Result.xlsx";
public void Create(string input)
{
// ワークブックの作成
Workbook workbook = new Workbook();
// ワークシートの取得
IWorksheet worksheet = workbook.Worksheets[0];
// セル範囲を指定して文字列を設定
worksheet.Range["B2"].Value = "Hello DioDocs!";
worksheet.Range["B3"].Value = "from " + input;
// メモリストリームに保存
MemoryStream ms = new MemoryStream();
workbook.Save(ms, SaveFileFormat.Xlsx);
ms.Seek(0, SeekOrigin.Begin);
// S3にアップロード
AmazonS3Client client = new AmazonS3Client(RegionEndpoint.APNortheast1);
var request = new PutObjectRequest
{
BucketName = bucketName,
Key = uploadExcelName,
InputStream = ms
};
client.PutObjectAsync(request);
}
}
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using System;
using System.Drawing;
using System.IO;
:
:
class DDPdf
{
private const string bucketName = "diodocs-storage";
private const string uploadPdfName = "Result.pdf";
public void Create(string input)
{
// PDFドキュメントを作成します。
GcPdfDocument doc = new GcPdfDocument();
// ページを追加し、そのグラフィックスを取得します。
GcPdfGraphics g = doc.NewPage().Graphics;
// ページに文字列を描画します。
g.DrawString("Hello DioDocs!" + Environment.NewLine + "from " + input,
new TextFormat() { Font = StandardFonts.Helvetica, FontSize = 12 },
new PointF(72, 72));
// メモリストリームに保存
MemoryStream ms = new MemoryStream();
doc.Save(ms, false);
ms.Seek(0, SeekOrigin.Begin);
// S3にアップロード
AmazonS3Client client = new AmazonS3Client(RegionEndpoint.APNortheast1);
var request = new PutObjectRequest
{
BucketName = bucketName,
Key = uploadPdfName,
InputStream = ms
};
client.PutObjectAsync(request);
}
}

関数ハンドラの更新

FunctionHandlerのコードを以下のように修正してDDExcelDDPdfで実装したDioDocsの処理を呼び出します。

public class Function
{
public string FunctionHandler(string input, ILambdaContext context)
{
var ddexcel = new DDExcel();
var ddpdf = new DDPdf();
try
{
ddexcel.Create(input);
ddpdf.Create(input);
return "OK";
}
catch (Exception e)
{
return e.ToString();
}
}
}

デバッグ実行で確認

「Mock Lambda Test Tool」をクリックしてデバッグ実行します。

デバッグ実行で確認

ブラウザが起動し以下の画面が表示されます。

Mock Lambda Test Tool

「Function Input」のフォームに、デバッグ実行しているLambda関数に渡す値AWS Lambdaを入力して「Execute Function」をクリックします。

Mock Lambda Test Tool

成功すると「Response」のラベルにOKが表示されます。

Mock Lambda Test Tool

AWS Explorerからdiodocs-storageをクリックして、DioDocsで作成したExcelとPDFが保存されているか確認できます。なお、デプロイした後にも確認するので保存されているExcelとPDFはここで一旦削除しておきます。

保存したファイルを削除

デプロイして確認

実際にAWS Lambdaに作成したLambda関数をデプロイして確認します。ソリューションエクスプローラーからプロジェクトDDAWSLambda1を右クリックして「Publish to AWS Lambda」をクリックします。

デプロイして確認

「Function Name」にDioDocsLambdaFunction1を入力して「Next」をクリックします。

デプロイして確認

「Role Name」にNew role based on AWS managed policy: AWSLambdaFullAccessを設定して「Upload」をクリックします。

デプロイして確認

成功すると以下の画面が表示されます。

デプロイして確認

AWS ExplorerにデプロイしたLambda関数DioDocsLambdaFunction1が表示されます。こちらをクリックすると以下の画面が表示されます。

デプロイして確認

DioDocsLambdaFunction1に渡す値"AWS Lambda Function!!"を入力して動作を確認できます。

デプロイして確認

AWS Explorerからdiodocs-storageをクリックして、DioDocsで作成したExcelとPDFが保存されているか確認できます。

デプロイして確認

Lambda関数で作成したExcelとPDFはこちらです。

結果(EXCEL)

結果(PDF)

以上のように、Visual StudioとAWS Toolkit for Visual Studio、そしてAWS SDK for .NETと組み合わせて利用することで、DioDocsはAWSでも使うことができます。


Azure FunctionsでDioDocsを使うには?

本記事ではAWS Lambdaを取り上げましたが、Azure FunctionsでDioDocsを使うケースについては以下の記事で解説しています。こちらも機会があれば試してみてください。