BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

AWS Lambda を .Net Core と ( .NET Standard と) C# で実装 ~ 環境変数 の読込む

引き続き AWS Lambda を C# で、.NET Core 1.0、.NET Standard 1.6 を使って実装する際のメモです。 環境変数の取り扱いについてです。

(2017/9月時点での話=.NET Core 1.0しかサポートしてない時点です)

Overview

 1 開発環境の準備 (その1)
 2 .NET Core 1.0 対応の .NET Standard 1.6 のクラスライブラリの作成(その1)
 3 簡易なクラスライブラリー実装(その1)
 4 Console プロジェクトの作成(その2)
 5 Autofac の実装(その2)
 6 AWS Labmda プロジェクトの作成(その2)
 7 AWS Labmda の環境変数を読み込む(←今回ココから)
 8 AWS API Gateway から Lambda - プロキシ統合 の使用とか
 9 AWS Lambda から AWS Lambda の呼び出し
 10 AWS Lambda から CloudWatch Events の呼び出し

デバッグ時( = 前回作成したConsoleAppでデバッグ実行時 )にはローカルの環境の環境変数を使い、

AWS Lambda上で実行時は、Lambdaの環境変数を読み込む実装イメージです。

7 AWS Labmda の環境変数を読み込む

AWS Lambda では、関数ごとに環境変数を設定できるので、そこで環境に応じたキーとか諸々を設定できます(詳しくは以下リンク)。

Environment Variables - AWS Lambda

デバッグ実行用に appsettings.json を用意

デバッグ実行(ConsoleAppからの実行)時に、appsettings.json を読み込むので、
LambdaDemo.ConsoleApp」プロジェクトを右クリック > 追加 > クラス をクリックします(jsonを追加するんですが面倒なんで...)

名前に「appsettings.json」と入力しして 追加 をしましょう。

f:id:beachside:20170930214752p:plain


追加後、「appsettings.json」ファイルを右クリック > プロパティ を開きます。

f:id:beachside:20170930215843p:plain


左ペイン「全般」 > 「詳細設定」 > 「出力ディレクトリにコピー」を「新しい場合はコピーにする」くらいにしておきましょう。

f:id:beachside:20170930214756p:plain


次は、jsonを編集します。「appsettings.json」ファイル開き、空っぽにしてから以下のように編集します。

{
  "env_info": "LOCAL DEBUG",
  "aws_endpoint": "ap-northeast-1"
}

IoCコンテナのプロジェクトで一括管理

環境変数読み込みの実現方法としては、ASP.NET Core のやつと同様です(詳しくは以下リンク)。

ASP.NET Core の構成 | Microsoft Docs

前回作成した「LambdaDemo.IoC」プロジェクトの、DemoContaioner.cs を開きます。
コンストラクター LambdaDemo.IoC() で、読み込むための設定しています。

今回は、以下のコードを実装しています(後ほどクラス全体のコードを載せてます)。

static DemoContainer()
{
    Configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", true, true)
        .AddEnvironmentVariables()
        .Build();
//以下略

appsettings.json を読み込み、そのあとに環境変数を読み込んで上書きするというイメージです。
が、Lambda側に appsettings.json を配置する予定はないので、実際のところは以下のイメージです。

  • デバッグ実行時(ConsoleAppからの実行時)なら appsettings.json を読み込む(ローカルのデバッグ環境には必要な環境変数を設定していない想定)。
  • Lambdaで実行時は、環境変数を読み込む。

json のパスを代えたいときは、 jsonを読み込む前に SetBasePath を読み込んであげると良いです。

で、後はこんな感じで実装すればOKです。( DemoContainer クラスの全体) 46-47行目でそれぞれ読み込んで、読み込んだ値を49-50行目ログに出すようにしました。

実際に実行してみると正しく動いていることが確認できます。

f:id:beachside:20170930214800p:plain


AWS Lambda での実行確認

前回作った状態のアプリで、「LambdaDemo.Lambda」プロジェクトをデプロイしてみましょう。 (デプロイのやり方は以下リンク)

デプロイ!

AWS Lambda で環境変数の設定

AWS マネジメントコンソールで デプロイした Lambda関数のページを開き、「コード」タブの下の方で環境変数を設定します。
環境変数のキーには「-」が使えなかったりするので注意です(appsettings.jsonから考慮が必要ですね)。
appsettings.json と同じキーを設定し、値は、env_infoだけ変えてみました。

f:id:beachside:20170930214804p:plain


保存してテストしてみましょう。

f:id:beachside:20170930214808p:plain


CloudWatch でログを見てみると、env_info が正しく取得できていることが確認できます。

f:id:beachside:20170930214838p:plain


もう少し実践的なところは、Lambda から Lambda を呼ぶ際などにやるとします。