- 投稿日:2021-06-03T18:24:58+09:00
AWS LambdaにC#プロジェクトをデプロイする
概要 AWS LambdaにC#プロジェクトをデプロイする場合、 Windows版のVisual StudioであればGUIからボタンぽちぽちで完了するので良いのですが(要AWS Toolkit for Visual Studio)、 Visual Studio for Macの場合はできません。 そのため、Macの場合はCUIからデプロイする必要があるので、本記事でその方法についてまとめておきます。 事前準備 ●AWS CLIをインストール brew install awscli ●Amazon.Lambda.Tools .NET Core Global Tool .NETアプリケーションをAWS Lambdaへデプロイするために必要です。 dotnet tool install -g Amazon.Lambda.Tools ●プロファイル作成 ローカルPCからAWSへCLIで操作を行う場合、都度「プロファイル」を指定して接続する形になります。 ※あらかじめAWSでCLIで使用するためのIAMを設定し、AccessKey及びSecretAcccessKeyを取得しておきます。 aws configure --profile {プロファイル名} # 例: aws configure --profile user1 AWS Access Key ID: {設定したIAMから払い出されたキーをコピー} AWS Secret Access Key: {同上} Default region name: {東京の場合は ap-northeast-1 を指定} Default output format: JSON C#プロジェクトの準備 ●設定ファイル デプロイコマンドを実行する前に、C#プロジェクトに 「どのリージョン」に「どのプロファイル」を使用して、「どのLambda関数」にデプロイする、等といった設定ファイルをJSON形式で用意しておく必要があります。 ファイル名: aws-lambda-tools-defaults.json 階層: 「.csproj」ファイルと同階層に配置 { "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "configuration": "Release", "framework": "netcoreapp3.1", "profile": "default", // AWS CLI プロフィール "region": "ap-northeast-1", // AWSリージョン指定 "function-runtime": "dotnetcore3.1", // Lambbda実行ランタイム "function-memory-size": 512, // Lambdaメモリ(MB) "function-timeout": 30, // Lambdaタイムアウト時間(seconds) "function-handler": "SearchConnpassLineBot::SearchConnpassLineBot.Function::FunctionHandler", // Lambda実行時にコールするメソッドを指定 "function-name": "SearchConnpassLineBot", // Lambda名称 "function-role": "arn:aws:iam::000000000000:role/MyLambdaRole" // AWSロール名 } デプロイ方法 ●デプロイコマンド 簡単です。 デプロイしたい「.csproj」ファイルがある改装で以下コマンドを実行します。 dotnet lambda deploy-function 以上でデプロイ完了です! お疲れ様でした!
- 投稿日:2021-06-03T03:36:20+09:00
C# テキストファイルの保存 便利なCSV
ファイルの保存 NUll確認やファイルの存在確認を利用して細かくエラーハンドリングしながらファイル操作を行うのは色々と気を遣います。 Fileクラスで保存する場合、Windowsのように(1),(2),,,を末尾につけて自動でインデックスは振ってくれないので同名のファイルが存在していても平気で上書きします。そこで、ファイルがいたらインデックスをつけて新しくファイルを作る方法を紹介します。 string sの中身は「,」区切りの文字列であればよくCSVも同じテキストファイルなので拡張子をcsvにすればOK あとは出来たファイルをExcelかGoogleSpreadSheetでインポートすれば素敵な表が瞬時に作れます。 メモ帳で開いて中身を確認することもできるのでデータの抜き取りやHTMLの解析などに使い勝手が良いです。 これだけのためにフォームアプリを利用する気にはならないのでコンソールアプリで開発するひとには必須です。 次のコードはメソッドで後からメイン側で呼び出せるようにしています。 sample.cs using System; using System.IO; private static void SaveFile(string s) { string DesktopDir = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); string FileName = "MJ_Resultlist"; string Extend = ".csv"; string FilePath = DesktopDir + "\\" + FileName + Extend; //上記の別の書き方 //string FilePath = Path.Combine(DesktopDir,FileName) + Extend; //コメントでいただきましたメソッドです。フォルダ階層が深い場合は有効そうですね。 int FileIndex = 0; //上書しないよう被らないファイル名になるまでループ while (File.Exists(FilePath) == true) { FileIndex++; FilePath = DesktopDir + "\\" + FileName + "(" + FileIndex.ToString() + ")" + Extend; } // 文字列をファイルに保存 if (string.IsNullOrWhiteSpace(s) == false) File.WriteAllText(FilePath, s); else Console.WriteLine("ファイル保存失敗"); } 引数sの中身の代入例としては sample1.cs string s = "A" +","+ "B" +","+ "C"; と書いても良いですが、使い勝手が悪いので sample2.cs var list = new List<string>(); list.Add("A"); list.Add("B"); list.Add("C"); string s = string.join(",",list); SaveFile(s); //出力 /********* A,B,C *********/ のほうが見やすいです。また、CSVファイルの場合、改行コード"\n"を入れることで 段替えをおこなうことができます。 sample3.cs var listA = new List<string>(); listA.Add("A1"); listA.Add("A2"); listA.Add("A3"); var listB = new List<string>(); listB.Add("B1"); listB.Add("B2"); listB.Add("B3"); var listC = new List<string>(); listC.Add("C1"); listC.Add("C2"); listC.Add("C3"); string A = string.join(",",listA); string B = string.join(",",listB); string C = string.join(",",listC); string s = A + "\n" + B + "\n" + C; SaveFile(s); //出力 /********* A1,A2,A3 B1,B2,B3 C1,C2,C3 *********/ ディレクトリの環境依存 提供先が誰に渡るか分からない場合、いちいちPCのユーザー名を聞き出してディレクトリに してしまうのはよくありません。このソフトがどの環境で使用されてもいいようにSystemクラスに は環境を呼び出すクラスが用意されています。次のコードは環境のデスクトップを呼び出しますので どのPCでプログラムを実行してもそのデスクトップに保存されます。 System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) ここからフォルダを自動生成して中に保存することもできます。 呼び出し ファイルの保存は基本的に非同期処理が好ましく、フォームアプリならプログラムのセッションはソフト終了まで 続くので例えばセーブボタンを押してから保存完了まで操作を受け付けないというのは望ましい動作とは言えません。 しかし、今回はコンソールアプリなのでセッションが終わると非同期処理も途中で落ちてしまいます。 そこでWait()を使ってタスク完了まで待ち、完了したらセッションを閉じるようにしています。 (最初から非同期にしなければ良いと思うかもしれませんがコードに汎用性を持たせるため) メインで呼び出すときは、次のようなコードになります。 Main.cs using System.Threading.Tasks; // ファイルの保存(別タスクで非同期処理 続けて処理をおこなうときはWait()を削除する) Task task1 = Task.Run(() =>{ SaveFile(resultstr); }); task1.Wait();