[アップデート] AWS Elastic Beanstalk の環境プロパティが Secrets Manager と SSM パラメータストアのネイティブ統合をサポートしました

[アップデート] AWS Elastic Beanstalk の環境プロパティが Secrets Manager と SSM パラメータストアのネイティブ統合をサポートしました

Clock Icon2025.04.02

いわさです。

AWS Elastic Beanstalk は環境の「環境プロパティ」を設定することで実行環境の環境変数を設定することができます。
これまでプレーンテキストのみがサポートされていたのですが、先日のアップデートで A
先日の AWS Elastic Beanstalk のアップデートで、AWS Secrets Manager のシークレット、AWS Systems Manager のパラメータストアをサポートしました。

https://aws.amazon.com/about-aws/whats-new/2025/03/aws-elastic-beanstalk-retrieving-secrets-configuration-secrets-manager-systems-manager/

これまではネイティブの統合がされていなかったので、アプリケーションコードから直接 Secrets Manager にアクセスしたり、あるいは ebextensions を使って起動時にカスタムスクリプトを実行してシークレットにアクセスする必要がありました。

今回 .NET アプリケーションからシークレット環境変数へアクセスする環境を作成してみましたのでその様子を紹介します。

.NET アプリケーションの用意

先日のアップデートで AWS Elastic Beanstalk は .NET 9 をサポートしたのでこちらの環境を使ってみます。

https://dev.classmethod.jp/articles/elastic-beanstalk-net-9-amazon-linux-2023/

アプリケーション実装は最小にしたくて、今回は Minimal API で環境変数を出力する ASP.NET Core アプリケーションにしてみます。

% dotnet new web -n hoge0402app
The template "ASP.NET Core Empty" was created successfully.

Processing post-creation actions...
Restoring /Users/iwasa.takahito/work/hoge0402eb/hoge0402app/hoge0402app.csproj:
Restore succeeded.
Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");
app.MapGet("/hoge", () => {
    var hogeParam = Environment.GetEnvironmentVariable("HOGE_PARAM") ?? "環境変数が設定されていません";
    return $"HOGE_PARAM の値: {hogeParam}";
});

app.Run();

ローカルで確認してみます。

% HOGE_PARAM="hogehoge" dotnet run
Using launch settings from /Users/iwasa.takahito/work/hoge0402eb/hoge0402app/Properties/launchSettings.json...
Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5022
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /Users/iwasa.takahito/work/hoge0402eb/hoge0402app

:

% curl http://localhost:5022/hoge 
HOGE_PARAM の値: hogehoge

良いですね。環境変数の値が出力されています。
デプロイパッケージを作成して Elastic Beanstalk のアップロードします。

% dotnet publish -c Release -r linux-x64 --self-contained true -o ./publish
Restore complete (3.3s)
  hoge0402app succeeded (2.4s) → publish/

Build succeeded in 6.1s
% cd publish 
% zip -r ../hoge0402dotnet.zip *
  adding: Microsoft.AspNetCore.Antiforgery.dll (deflated 51%)
  adding: Microsoft.AspNetCore.Authentication.Abstractions.dll (deflated 48%)
  adding: Microsoft.AspNetCore.Authentication.BearerToken.dll (deflated 48%)
  adding: Microsoft.AspNetCore.Authentication.Cookies.dll (deflated 49%)
  adding: Microsoft.AspNetCore.Authentication.Core.dll (deflated 54%)

  :

  adding: libmscordbi.so (deflated 62%)
  adding: mscorlib.dll (deflated 64%)
  adding: netstandard.dll (deflated 67%)

E1B95346-5B3B-4362-BE7D-C066762F6382.png

環境プロパティに Secrets Manager を設定してみる

まず今回のアップデートで、環境プロパティの作成時に次にようにプロパティのソースを指定できるようになりました。

606861AA-1D3A-4CC1-B6B0-7246860F7C54.png

従来までは特に指定をせずにプレーンテキストのみがサポートされていた認識です。
今回は Secrets Manager に新規シークレットを作成し、そいつを環境プロパティに設定してみたいと思います。
事前に次のようなシークレットを作成済みです。

C527F406-A274-4576-B941-50E48FCF21A2.png

シークレットやパラメータストアの場合、環境プロパティでリソース ARN を指定します。

4DAC7573-5EE9-4D93-BC98-FAAB73AA4C05.png

このまま通常どおり環境を作成したところ、エラーが立ち上がりに失敗しました。
内容を見てみると GetSecretValue に失敗しているとのこと。なるほど起動時に取得するのか。

AA3D6ED2-2546-4A36-B103-E8969F9585A6.png

ということでインスタンスプロファイルで指定した IAM ロールに GetSecretValue 権限を付与しました。サービスロールではなくインスタンスプロファイルのほうです。

image.png

で、この段階でエラーが出ている場合はアプリケーションサーバー再起動は失敗するので、環境の再構築を行う必要があります。

image.png

無事起動したのでアプリケーションにアクセスしてみます。

% curl http://hoge0402dotnet-env.eba-mdicmkfe.ap-northeast-1.elasticbeanstalk.com/hoge
HOGE_PARAM の値: hogesecrets

うまくシークレット値が表示されていますね。

ソースの更新が発生した場合

先ほどの IAM ポリシーのエラーから起動時にシークレットの読み込みを行っていそうなことがわかります。シークレットやパラメータストアの更新が発生した場合はどうなるのか確認してみましょう。
シークレット値を次のように変更しました。

7A2212CB-23CA-4182-AC64-74196D863684.png

試してみたところ、予想どおり Elastic Beanstalk 側は更新されませんでした。起動時の値を保持し続けているようです。

% curl http://hoge0402dotnet-env.eba-mdicmkfe.ap-northeast-1.elasticbeanstalk.com/hoge
HOGE_PARAM の値: hogesecrets

更新したい場合はアプリケーションサーバーの再起動を行いましょう。また GetSecretValue してくれます。

image.png

% curl http://hoge0402dotnet-env.eba-mdicmkfe.ap-northeast-1.elasticbeanstalk.com/hoge
HOGE_PARAM の値: hogesecrets2

新しいシークレット値に更新されました。
シークレットの自動ローテーションを設定している場合は注意したいです。

Elastic Beanstalk のプラットフォームバージョンに制限あり

アナウンスには明記されていないのですが、今回の機能は Elastic Beanstalk のどのプラットフォームバージョンでもサポートされているわけではありません。
次のように、2025 年 3 月 26 日以降のリリースされたバージョンである必要があるとのことです。[1]

Platform versions that were released on or after March 26, 2025 support AWS Secrets Manager secrets and AWS Systems Manager Parameter Store parameters configured as environment variables.

試しに少し古いバージョン 3.3.0 で試してみましょう。どういう挙動になるのかな。

F253C492-FCE0-461F-9396-89960FFAE9D7.png

環境プロパティでシークレットソースを指定することはできるのですが、作成ウィザードの検証フェーズでエラーになりました。

938E9D74-4288-46C1-BB13-DBD8DE1B6DD2.png

さいごに

本日は AWS Elastic Beanstalk の環境プロパティが Secrets Manager と SSM パラメータストアのネイティブ統合をサポートしたので、.NET 9 + Secrets Manager で試してみました。

これ結構嬉しい方とか、もっと早く来てほしかったという方多いのではないでしょうか。
Elastic Beanstalk 地味にアップデートされ続けているのでまだ全然使えそうだなーと思いました。

脚注
  1. Using Elastic Beanstalk with AWS Secrets Manager and AWS Systems Manager Parameter Store - AWS Elastic Beanstalk ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.