AWS Elastic Beanstalkで生成したRDSが、Beanstalk環境から切り離せるようになりました

2021.10.08

いわさです。

Elastic Beanstalkでは環境作成オプションとしてRDSインスタンスを紐付けて作成することが可能です。

しかし、この機能で作成されたRDSはBeanstalk環境のライフサイクルに紐付けられているため本番環境としては、個別にRDSを用意して接続することが推奨されていました。

公式ドキュメントにも以下の記述があります。

Amazon RDS で Elastic Beanstalk を使用する - AWS Elastic Beanstalk

AWS Elastic Beanstalk は、Elastic Beanstalk 環境で Amazon Relational Database Service (Amazon RDS) インスタンスを実行するためのサポートを提供します。詳細については、「Elastic Beanstalk 環境にデータベースを追加する」を参照してください。この作業は環境の開発およびテストに適しています。ただし、データベースインスタンスのライフサイクルをアプリケーション環境のライフサイクルに結び付けるため、実稼働環境に理想的なものではありません。

しかし先日のアップデートで、Beanstalk環境からRDSを保持したまま切り離すことが出来るようになりました。
英語のドキュメントは早速以下のように更新されています。

Using Elastic Beanstalk with Amazon RDS - AWS Elastic Beanstalk

You can use Elastic Beanstalk with Amazon Relational Database Service (Amazon RDS) to set up, operate, and scale a relational database. >There are two options to get started, which are the following.

Create a new database in Amazon RDS.

Start with a database that was previously created by Elastic Beanstalk and subsequently decoupled from a Beanstalk environment. For more information, see Adding a database to your Elastic Beanstalk environment.

You can use either approach to run a database instance in Amazon RDS and configure your application to connect to it on launch. You can connect multiple environments to a database and also perform seamless updates with blue-green deployments.

今回はこれまでのオプションと、今回追加されたオプションでの挙動を確認してみました。

いままで

これまでは、デカップリング操作とBeanstalk環境削除時に紐付けられているRDSが削除されていました。
ただしRDS削除時のオプションとしてスナップショットを取得するオプションについては用意されていました。

デカップリング時にRDS削除

環境にデータベースが接続されている状態で、データベースをデカップリング操作を行うと、設定されている削除ポリシー(そのまま削除 or スナップショットを取得して削除)に従ってRDSが削除されていました。

デカップリング後はRDSインスタンスは削除され、aws:rds:dbinstance HasCoupledDatabasefalseになります。

Platform:
  PlatformArn: arn:aws:elasticbeanstalk:ap-northeast-1::platform/.NET Core running on 64bit Amazon Linux 2/2.2.6
OptionSettings:
  aws:elasticbeanstalk:environment:
    ServiceRole: arn:aws:iam::123456789012:role/aws-elasticbeanstalk-service-role
    LoadBalancerType: application
  aws:autoscaling:launchconfiguration:
    DisableIMDSv1: true
    IamInstanceProfile: aws-elasticbeanstalk-ec2-role
  aws:rds:dbinstance:
    HasCoupledDatabase: false
    DBEngine: mysql
EnvironmentTier:
  Type: Standard
  Name: WebServer
AWSConfigurationTemplateVersion: 1.1.0.0

Beanstalk環境削除時にRDS削除

Beanstalk削除時にもRDSインスタンスは削除されます。
先程と同じように削除ポリシーに従って、スナップショットを取る場合があります。
設定されている削除ポリシーは以下のように確認ダイアログで確認も可能です。

スナップショットが作成され、RDSが削除されていました。

今回、出来るようになったこと

データベース削除ポリシーに「保持」が追加されました。
こちらを選択すると先程の操作を行ったときにRDSインスタンスは削除されず保持されます。

デカップリング時に保持

削除ポリシーで「保持」が選択されたBeanstalk環境からデータベースのデカップリングを試してみます。

デカップリングされました。
しかし、RDSは利用可能な状態のまま残っていますね。

Beanstalk環境削除時に保持

では削除ポリシーが「保持」に設定されたBeanstalk環境を削除してみます。
削除ダイアログでも保持される旨の記述がありますね。

操作実行後、Beanstalk環境は削除されましたが、RDSインスタンスは影響を受けずに保持されていました。

さいごに

RDSがライフサイクルに紐付けられてしまい回避できない挙動がいまいちだなと思っていた方には良いアップデートですね。
Webサイトをホストする様々なマネージドサービスが登場していますが、Beanstalkの機能が更新され続けているのはちょっと驚きました。

Beanstalkのベストプラクティスが変わりそうなアップデートでした。