Elastic Beanstalk でデータベース(Amazon RDS),RabbitMQ,Redisを利用する

最終更新日: 2020年6月12日
R8 | R9

Amazon RDSの概要

Amazon Relational Database Service (Amazon RDS) は AWS 上で動作するリレーショナルデータベースサービスです。内部で動作するデータベースエンジンは MySQL や PostgreSQL といったオープンソースのデータベースから、Oracle や SQL Server といった商用データベースまでを扱うことができます。利用者はこれらのエンジンを選択することができます。

本節ではデータベースエンジンに MySQL を用いています。お使いのデータベースに合わせて、以降の説明を適切に読み替えてご利用ください。

データベースパラメータグループの作成

はじめにデータベースパラメータグループを作成します。

C:\Wagby-8.1.2\ebs>aws rds create-db-parameter-group --db-parameter-group-name ebswagby-db-param --db-parameter-group-family mysql5.6 --description ebswagby-db-param
{
    "DBParameterGroup": {
        "DBParameterGroupName": "ebswagby-db-param",
        "DBParameterGroupFamily": "mysql5.6",
        "Description": "ebswagby-db-param",
        "DBParameterGroupArn": "arn:aws:rds:ap-northeast-1:234318443261:pg:ebswagby-db-param"
    }
}

次に、作成したデータベースパラメータグループの設定を変更します。データベースへのパラメータ設定の数だけコマンドを発行します。

character_set_client

C:\Wagby-8.1.2\ebs>aws rds modify-db-parameter-group --db-parameter-group-name ebswagby-db-param --parameters ParameterName=character_set_client,ParameterValue=utf8,ApplyMethod=immediate
{
    "DBParameterGroupName": "ebswagby-db-param"
}

character_set_connection

C:\Wagby-8.1.2\ebs>aws rds modify-db-parameter-group --db-parameter-group-name ebswagby-db-param --parameters ParameterName=character_set_connection,ParameterValue=utf8,ApplyMethod=immediate
{
    "DBParameterGroupName": "ebswagby-db-param"
}

character_set_database

C:\Wagby-8.1.2\ebs>aws rds modify-db-parameter-group --db-parameter-group-name ebswagby-db-param --parameters ParameterName=character_set_database,ParameterValue=utf8,ApplyMethod=immediate
{
    "DBParameterGroupName": "ebswagby-db-param"
}

character_set_results

C:\Wagby-8.1.2\ebs>aws rds modify-db-parameter-group --db-parameter-group-name ebswagby-db-param --parameters ParameterName=character_set_results,ParameterValue=utf8,ApplyMethod=immediate
{
    "DBParameterGroupName": "ebswagby-db-param"
}

character_set_server

C:\Wagby-8.1.2\ebs>aws rds modify-db-parameter-group --db-parameter-group-name ebswagby-db-param --parameters ParameterName=character_set_server,ParameterValue=utf8,ApplyMethod=immediate
{
    "DBParameterGroupName": "ebswagby-db-param"
}

skip-character-set-client-handshake

C:\Wagby-8.1.2\ebs>aws rds modify-db-parameter-group --db-parameter-group-name ebswagby-db-param --parameters ParameterName=skip-character-set-client-handshake,ParameterValue=1,ApplyMethod=pending-reboot
{
    "DBParameterGroupName": "ebswagby-db-param"
}

アプリケーションのビルド

外部データベースを利用する wagbyapp アプリケーションをビルドします。これまでの説明のとおり、files.zip を用意するものとします。

今回は次の内容のfiles.zipを作成しています。

Archive:  files.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  12-26-2018 15:58   .ebextensions/
      188  12-26-2018 11:58   .ebextensions/rabbitmq.config
       94  12-25-2018 22:38   .ebextensions/rds.config
      165  12-26-2018 11:58   .ebextensions/redis.config
     4469  12-21-2018 15:29   .ebextensions/storage-efs-mountfilesystem.config
        0  12-26-2018 11:48   .ebextensions/tomcat/
        0  12-25-2018 13:09   .ebextensions/tomcat/bin/
     1627  12-25-2018 13:09   .ebextensions/tomcat/bin/InitLoader.jar
      393  12-25-2018 13:09   .ebextensions/tomcat/bin/init_db.sh
      435  12-26-2018 10:40   .ebextensions/tomcat/change_boot_script.sh
     2132  12-26-2018 11:48   .ebextensions/tomcat/change_db_config.sh
        0  12-21-2018 20:27   .ebextensions/tomcat/conf/
      402  12-19-2018 19:35   .ebextensions/tomcat/conf/app_jaas.config.txt
     3837  12-19-2018 19:36   .ebextensions/tomcat/conf/logging.properties
   174412  12-19-2018 19:36   .ebextensions/tomcat/conf/web.xml
     1377  12-26-2018 10:37   .ebextensions/tomcat/copy.sh
      617  12-26-2018 11:43   .ebextensions/tomcat/initloader.sh
        0  12-26-2018 15:25   .ebextensions/tomcat/lib/
  1515894  12-19-2018 19:35   .ebextensions/tomcat/lib/hsqldb.jar
     6067  12-20-2018 12:05   .ebextensions/tomcat/lib/j_conint.jar
  2132635  12-25-2018 16:34   .ebextensions/tomcat/lib/mysql-connector-java-8.0.13.jar
    10596  12-20-2018 12:05   .ebextensions/tomcat/lib/spring-instrument-tomcat.jar
   279700  12-20-2018 12:11   .ebextensions/tomcat/lib/tomcat-dbcp.jar
      623  12-26-2018 10:38   .ebextensions/tomcat-settings.config
     2462  12-26-2018 15:56   .ebextensions/wagby-initloader.config
      614  12-21-2018 20:28   ROOT.war
107518950  12-26-2018 11:14   wagby.war
---------                     -------
111657689                     27 files

ダウンロード

評価用として作成した eb_files_db.zip をダウンロードできます。

ルートデプロイメントかそうでないかの場合や、WAR ファイルのファイル名などを、ご利用のアプリケーションにあわせて修正してください。

データベースの作成

ここでは Amazon RDS のデータベースを作成します。eb create コマンドにデータベースの設定を指定することができます。

eb createのオプションには次の指定が用意されています。

-db -db.engine mysql -db.i db.t2.micro -db.user meigh9uK -db.pass Oobohh6f -db.version 5.6.40 -db.size 5

db.engine は mysql, oracle-se1, postgres, sqlserver-ex, sqlserver-web, sqlserver-se のいずれかを指定できます。Auroraは選択肢にありません。

それでは eb create コマンドを実行します。データベースのパスワードを尋ねられるので、あらかじめ用意しておくとよいです。

C:\Wagby-8.1.2\ebs>eb create -i t3.small --vpc --scale 1 -db -db.engine mysql -db.version 5.6.41
Enter Environment Name
(default is ebswagby-dev):
Enter DNS CNAME prefix
(default is ebswagby-dev):
Select a load balancer type
1) classic
2) application
3) network
(default is 2):
Enter an RDS DB username (default is "ebroot"):
Enter an RDS DB master password:
Retype password to confirm:
Enter the VPC ID: vpc-0208b3ab6a7cf8978
Do you want to associate a public IP address? (Y/n):
Enter a comma-separated list of Amazon EC2 subnets: subnet-0c4d1541a528c63ba,subnet-030085de17d83f973
Enter a comma-separated list of Amazon ELB subnets: subnet-0c4d1541a528c63ba,subnet-030085de17d83f973
Do you want the load balancer to be public? (Select no for internal) (Y/n):
Enter a comma-separated list of Amazon VPC security groups: sg-0d6b4b276edf7d47c
Enter a comma-separated list of database subnets: subnet-0c4d1541a528c63ba,subnet-030085de17d83f973
Uploading: [##################################################] 100% Done...
Environment details for: ebswagby-dev
  Application name: ebswagby
  Region: ap-northeast-1
  Deployed Version: app-181226_112634
  Environment ID: e-bdmkc5mqd3
  Platform: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Tomcat 8.5 with Java 8 running on 64bit Amazon Linux/3.0.7
  Tier: WebServer-Standard-1.0
  CNAME: ebswagby-dev.ap-northeast-1.elasticbeanstalk.com
  Updated: 2018-12-26 02:26:47.132000+00:00
Printing Status:
2018-12-26 02:26:44    INFO    createEnvironment is starting.
2018-12-26 02:26:47    INFO    Using elasticbeanstalk-ap-northeast-1-234318443261 as Amazon S3 storage bucket for environment data.
2018-12-26 02:27:18    INFO    Created target group named: arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:targetgroup/awseb-AWSEB-L3Z8SSQBQG8A/61427781a0952302
2018-12-26 02:27:18    INFO    Created security group named: sg-095902694f6bf4b2b
2018-12-26 02:27:34    INFO    Created security group named: sg-09540a9f3354c271f
2018-12-26 02:27:34    INFO    Created Auto Scaling launch configuration named: awseb-e-bdmkc5mqd3-stack-AWSEBAutoScalingLaunchConfiguration-10FRD6WP659EF
2018-12-26 02:27:49    INFO    Created RDS database security group named: awseb-e-bdmkc5mqd3-stack-awsebrdsdbsecuritygroup-1jfi8fgp364ux
2018-12-26 02:27:49    INFO    Creating RDS database named: aa1ulxd1m6133ge. This may take a few minutes.
2018-12-26 02:29:25    INFO    Created load balancer named: arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:loadbalancer/app/awseb-AWSEB-1K9G0ND83HO/887643d448dad1fd
2018-12-26 02:29:40    INFO    Created Load Balancer listener named: arn:aws:elasticloadbalancing:ap-northeast-1:234318443261:listener/app/awseb-AWSEB-1K9G0ND83HO/887643d448dad1fd/cf6325caf94cf0a7
2018-12-26 02:34:33    INFO    Created RDS database named: aa1ulxd1m6133ge
2018-12-26 02:35:21    INFO    Created Auto Scaling group named: awseb-e-bdmkc5mqd3-stack-AWSEBAutoScalingGroup-FPDEIP1NCNIB
2018-12-26 02:35:21    INFO    Waiting for EC2 instances to launch. This may take a few minutes.
2018-12-26 02:35:36    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:234318443261:scalingPolicy:3a24fcdc-6036-4f3d-a2a9-8c5833af3137:autoScalingGroupName/awseb-e-bdmkc5mqd3-stack-AWSEBAutoScalingGroup-FPDEIP1NCNIB:policyName/awseb-e-bdmkc5mqd3-stack-AWSEBAutoScalingScaleUpPolicy-KH5GF4XGUO6N
2018-12-26 02:35:36    INFO    Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:234318443261:scalingPolicy:53912e15-29e7-4f6d-ae63-584c89b328c4:autoScalingGroupName/awseb-e-bdmkc5mqd3-stack-AWSEBAutoScalingGroup-FPDEIP1NCNIB:policyName/awseb-e-bdmkc5mqd3-stack-AWSEBAutoScalingScaleDownPolicy-MGW3FGSFSWYE
2018-12-26 02:35:36    INFO    Created CloudWatch alarm named: awseb-e-bdmkc5mqd3-stack-AWSEBCloudwatchAlarmHigh-GW16AXU5OI16
2018-12-26 02:35:36    INFO    Created CloudWatch alarm named: awseb-e-bdmkc5mqd3-stack-AWSEBCloudwatchAlarmLow-1RU4Y5Y9736G3
2018-12-26 02:36:50    INFO    Application available at ebswagby-dev.ap-northeast-1.elasticbeanstalk.com.
2018-12-26 02:36:50    INFO    Successfully launched environment: ebswagby-dev
DBインスタンスの追加には10分程度かかります。
eb create コマンドのオプションとして -db.user, -db.pass を指定することもできます。

注意点

eb terminate を行うと、ここで作成したデータベースも削除されます。

RabbitMQをサービスとして起動する

1つのEC2インスタンスに RabbitMQ をサービスとしてインストールし、起動する方法を説明します。

設定ファイル

.ebextensions/rabbitmq.config

yumを使って RabbitMQ をインストールします。また、サービスとして起動する設定を行います。 これによって wagbyapp が起動するEC2インスタンスにて、RabbitMQも起動されるようになります。 wagbyapp からは localhost として接続できます。

RabbitMQを使わない場合は、このファイルを削除してください。

サービスの異常停止時の対応

異常終了時の動作

EC2 上の RabbitMQ サービスが異常終了した場合、利用者の操作画面はエラーとなりませんが、その非同期処理プロセス(ダウンロードなど)は "待機" のままとなります。wagbyapp (Tomcat) のログは次のような記録が残ります。

2018-12-27 12:03:34 [ERROR org.springframework.amqp.rabbit.connection.CachingConnectionFactory log] Channel shutdown: connection error; protocol method: #method<connection.close>(reply-code=320, reply-text=CONNECTION_FORCED - broker forced connection closure with reason 'shutdown', class-id=0, method-id=0)
2018-12-27 12:03:34 [WARN com.rabbitmq.client.impl.ForgivingExceptionHandler log] An unexpected connection driver error occured (Exception message: Connection reset)
2018-12-27 12:03:35 [INFO org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer run] Restarting Consumer@7c4916e: tags=[{amq.ctag-pxZxPY2ksO46Au401VimsQ=wagbyUploadUpdateJobQueue, amq.ctag-_Tzh8_VOPlvbUttCXmpmBQ=wagbyJobQueue}], channel=Cached Rabbit Channel: AMQChannel(amqp://guest@127.0.0.1:5672/,1), conn: Proxy@18ddae6 Shared Rabbit Connection: SimpleConnection@1852db74 [delegate=amqp://guest@127.0.0.1:5672/, localPort= 56266], acknowledgeMode=AUTO local queue size=0
2018-12-27 12:03:35 [INFO org.springframework.amqp.rabbit.connection.CachingConnectionFactory createBareConnection] Attempting to connect to: [localhost:5672]
2018-12-27 12:03:35 [ERROR org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer redeclareElementsIfNecessary] Failed to check/redeclare auto-delete queue(s).
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused)
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:376)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:573)
...	

対応

sudo service rabbitmq-server start コマンドで RabbitMQ サービスを再起動してください。wagbyapp (Tomcat) の再起動は不要です。 エラーログ出力はなくなり、未処理のジョブが処理されるようになります。

Redisをサービスとして起動する

1つのEC2インスタンスに Redis をサービスとしてインストールし、起動する方法を説明します。

設定ファイル

.ebextensions/redis.config

yumを使って Redisをインストールします。また、サービスとして起動する設定を行います。 これによって wagbyapp が起動するEC2インスタンスにて、Redisも起動されるようになります。 wagbyapp からは localhost として接続できます。

Redisを使わない場合は、このファイルを削除してください。

サービスの異常停止時の対応

異常終了時の動作

EC2 上の Redis サービスが異常終了すると、HTTP ステータス 500 が返るようになります。wagbyapp (Tomcat) のログは次のような記録が残ります。

2018-12-27 12:01:01 [INFO jp.jasminesoft.jfc.controller.DbShowListBaseController perform_db] (admin@61.213.124.237|Chrome) myShowListJfcportal|Search 
2018-12-27 12:02:03 [ERROR org.springframework.data.redis.listener.RedisMessageListenerContainer handleSubscriptionException] Connection failure occurred. Restarting subscription task after 5000 ms
2018-12-27 12:02:05 [ERROR org.springframework.boot.web.support.ErrorPageFilter forwardToErrorPage] Forwarding to error page from request [/logonPage.do] due to exception [Unexpected end of stream.; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.]
org.springframework.data.redis.RedisConnectionFailureException: Unexpected end of stream.; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:67)
at org.springframework.data.redis.connection.jedis.JedisExceptionConverter.convert(JedisExceptionConverter.java:41)
at org.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:37)
at org.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:37)
at org.springframework.data.redis.connection.jedis.JedisConnection.convertJedisAccessException(JedisConnection.java:241)
...

対応

sudo service redis start コマンドで Redis サービスを再起動してください。wagbyapp (Tomcat) の再起動は不要です。 しかし Redis の再起動によってログオン中のセッションは消失するため、利用者がアクセスするとログオン画面が表示されるようになります。

[補足] ebextensionsフォルダ内のファイルについて

ここでは .ebextensionsフォルダ内の他のファイルについて説明します。

.ebextensions/rds.config

Elastic Beanstalk が eb create コマンド時にデータベースを作成しますが、この時に使われるデータベースパラメータを指定しています。

.ebextensions/storage-efs-mountfilesystem.config

EFSを用いて /efsをマウントしています。exportやupload_dirの永続化のためです。

.ebextensions/tomcat-settings.config

HSQLDBを利用する wagbyapp を Elastic Beanstalk で実行する > files フォルダ内のファイルについて で説明した copy.sh を、copy.sh と change_boot_script.sh に分割して指定しています。

また、wagbyapp 内で指定するデータベースやRedis,RabbitMQの設定を書き換えるためのスクリプトchange_db_config.shを実行します。

.ebextensions/wagby-initloader.config

データベースの初期テーブルを作成するための init_db.sh を実行します。

ここでは、すべてのコマンド実行に次の命令を指定しています。

test: "test ! -e  /efs/upload_dir/already_init_db.lck"

/efs/upload_dir/already_init_db.lck が存在しない場合に、このコマンドを実行します。処理終了後の 05-touch_lock_file でこのファイルを作成することで、再度 eb deploy したときに二重に実行されないようにしています。

init_db.sh を実行するためのJavaのプログラムはwagby.warファイル内に存在しているため、これを展開してから、実行する必要があります。実行後、展開したファイルを削除しています。なおinitloader.sh内では、データベースの設定を書き換えてからinit_db.shを実行しています。

.ebextensions/tomcat/copy.sh

HSQLDBを利用する wagbyapp を Elastic Beanstalk で実行する > files フォルダ内のファイルについて で説明した copy.sh の前半部分です。コピーやフォルダの作成を行います。

.ebextensions/tomcat/change_boot_script.sh

HSQLDBを利用する wagbyapp を Elastic Beanstalk で実行する > files フォルダ内のファイルについて で説明した copy.sh の後半部分です。Tomcat起動スクリプトにて、実行するカレントディレクトリを${CATALINA_HOME}/binに変更しています。

.ebextensions/tomcat/change_db_config.sh

META-INF/context.xmlに記述しているデータベースの設定を、Elastic Beanstalkにて用意されたデータベースの設定に書き換えるスクリプトです。

ルートデプロイメントの場合はファイルを直接書き換えることができますが、ルートデプロイメントでない場合はWARファイル内に設定が記述されているため、zip ファイルから展開して書き換え、再度 zip 圧縮するようになっています。

.ebextensions/tomcat/initloader.sh

データベースの設定を書き換えて init_db.sh を実行します。

.ebextensions/tomcat/bin/InitLoader.jar
.ebextensions/tomcat/bin/init_db.sh

init_db.shを実行するために必要なファイルをコピーします。wagbyapp/binから引用しています。

.ebextensions/tomcat/conf/app_jaas.config.txt
.ebextensions/tomcat/conf/logging.properties
.ebextensions/tomcat/conf/web.xml

Tomcatのconfフォルダにコピーするファイルです。wagbyapp/confから引用しています。app_jaas.configのファイル名が異なる理由は前ページに記載したとおりです。

.ebextensions/tomcat/lib/hsqldb.jar
.ebextensions/tomcat/lib/j_conint.jar
.ebextensions/tomcat/lib/mysql-connector-java-8.0.13.jar
.ebextensions/tomcat/lib/spring-instrument-tomcat.jar
.ebextensions/tomcat/lib/tomcat-dbcp.jar

Tomcatのlibフォルダにコピーするファイルです。wagbyapp/tomcat/libから引用しています。外部データベースに接続するため、JDBCドライバもコピーしています。

ルートデプロイメントの場合

ルートデプロイメントの場合は、次のファイルを修正してください。

.ebextensions/tomcat-settings.config

03-change_db_configのenv: と WARFILE:をコメントアウトします。

  03-change_db_config:
#    env:
#      WARFILE: "wagby.war"
    command: "sh .ebextensions/tomcat/change_db_config.sh"

.ebextensions/wagby-initloader.config

前半のNot root deployment部分をコメントアウトし、後半のRoot deploymentのコメントを外してください。