Elastic Beanstalk でデータベース(Amazon RDS),RabbitMQ,Redisを利用する
最終更新日: 2020年6月12日
R8 | R9
Amazon Relational Database Service (Amazon RDS) は AWS 上で動作するリレーショナルデータベースサービスです。内部で動作するデータベースエンジンは MySQL や PostgreSQL といったオープンソースのデータベースから、Oracle や SQL Server といった商用データベースまでを扱うことができます。利用者はこれらのエンジンを選択することができます。
本節ではデータベースエンジンに MySQL を用いています。お使いのデータベースに合わせて、以降の説明を適切に読み替えてご利用ください。
はじめにデータベースパラメータグループを作成します。
次に、作成したデータベースパラメータグループの設定を変更します。データベースへのパラメータ設定の数だけコマンドを発行します。
外部データベースを利用する wagbyapp アプリケーションをビルドします。これまでの説明のとおり、files.zip を用意するものとします。
今回は次の内容のfiles.zipを作成しています。
評価用として作成した eb_files_db.zip をダウンロードできます。
ルートデプロイメントかそうでないかの場合や、WAR ファイルのファイル名などを、ご利用のアプリケーションにあわせて修正してください。
ここでは Amazon RDS のデータベースを作成します。eb create コマンドにデータベースの設定を指定することができます。
eb createのオプションには次の指定が用意されています。
db.engine は mysql, oracle-se1, postgres, sqlserver-ex, sqlserver-web, sqlserver-se のいずれかを指定できます。Auroraは選択肢にありません。
それでは eb create コマンドを実行します。データベースのパスワードを尋ねられるので、あらかじめ用意しておくとよいです。
eb terminate を行うと、ここで作成したデータベースも削除されます。
1つのEC2インスタンスに RabbitMQ をサービスとしてインストールし、起動する方法を説明します。
yumを使って RabbitMQ をインストールします。また、サービスとして起動する設定を行います。
これによって wagbyapp が起動するEC2インスタンスにて、RabbitMQも起動されるようになります。
wagbyapp からは localhost として接続できます。
RabbitMQを使わない場合は、このファイルを削除してください。
EC2 上の RabbitMQ サービスが異常終了した場合、利用者の操作画面はエラーとなりませんが、その非同期処理プロセス(ダウンロードなど)は "待機" のままとなります。wagbyapp (Tomcat) のログは次のような記録が残ります。
sudo service rabbitmq-server start コマンドで RabbitMQ サービスを再起動してください。wagbyapp (Tomcat) の再起動は不要です。
エラーログ出力はなくなり、未処理のジョブが処理されるようになります。
1つのEC2インスタンスに Redis をサービスとしてインストールし、起動する方法を説明します。
yumを使って Redisをインストールします。また、サービスとして起動する設定を行います。
これによって wagbyapp が起動するEC2インスタンスにて、Redisも起動されるようになります。
wagbyapp からは localhost として接続できます。
Redisを使わない場合は、このファイルを削除してください。
EC2 上の Redis サービスが異常終了すると、HTTP ステータス 500 が返るようになります。wagbyapp (Tomcat) のログは次のような記録が残ります。
sudo service redis start コマンドで Redis サービスを再起動してください。wagbyapp (Tomcat) の再起動は不要です。
しかし Redis の再起動によってログオン中のセッションは消失するため、利用者がアクセスするとログオン画面が表示されるようになります。
ここでは .ebextensionsフォルダ内の他のファイルについて説明します。
Elastic Beanstalk が eb create コマンド時にデータベースを作成しますが、この時に使われるデータベースパラメータを指定しています。
EFSを用いて /efsをマウントしています。exportやupload_dirの永続化のためです。
HSQLDBを利用する wagbyapp を Elastic Beanstalk で実行する > files フォルダ内のファイルについて で説明した copy.sh を、copy.sh と change_boot_script.sh に分割して指定しています。
また、wagbyapp 内で指定するデータベースやRedis,RabbitMQの設定を書き換えるためのスクリプトchange_db_config.shを実行します。
データベースの初期テーブルを作成するための init_db.sh を実行します。
ここでは、すべてのコマンド実行に次の命令を指定しています。
/efs/upload_dir/already_init_db.lck が存在しない場合に、このコマンドを実行します。処理終了後の 05-touch_lock_file でこのファイルを作成することで、再度 eb deploy したときに二重に実行されないようにしています。
init_db.sh を実行するためのJavaのプログラムはwagby.warファイル内に存在しているため、これを展開してから、実行する必要があります。実行後、展開したファイルを削除しています。なおinitloader.sh内では、データベースの設定を書き換えてからinit_db.shを実行しています。
HSQLDBを利用する wagbyapp を Elastic Beanstalk で実行する > files フォルダ内のファイルについて で説明した copy.sh の前半部分です。コピーやフォルダの作成を行います。
HSQLDBを利用する wagbyapp を Elastic Beanstalk で実行する > files フォルダ内のファイルについて で説明した copy.sh の後半部分です。Tomcat起動スクリプトにて、実行するカレントディレクトリを${CATALINA_HOME}/binに変更しています。
META-INF/context.xmlに記述しているデータベースの設定を、Elastic Beanstalkにて用意されたデータベースの設定に書き換えるスクリプトです。
ルートデプロイメントの場合はファイルを直接書き換えることができますが、ルートデプロイメントでない場合はWARファイル内に設定が記述されているため、zip ファイルから展開して書き換え、再度 zip 圧縮するようになっています。
データベースの設定を書き換えて init_db.sh を実行します。
init_db.shを実行するために必要なファイルをコピーします。wagbyapp/binから引用しています。
Tomcatのconfフォルダにコピーするファイルです。wagbyapp/confから引用しています。app_jaas.configのファイル名が異なる理由は前ページに記載したとおりです。
Tomcatのlibフォルダにコピーするファイルです。wagbyapp/tomcat/libから引用しています。外部データベースに接続するため、JDBCドライバもコピーしています。
ルートデプロイメントの場合は、次のファイルを修正してください。
03-change_db_configのenv: と WARFILE:をコメントアウトします。
前半のNot root deployment部分をコメントアウトし、後半のRoot deploymentのコメントを外してください。
Amazon RDSの概要
データベースパラメータグループの作成
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"
}
アプリケーションのビルド
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
ダウンロード
データベースの作成
-db -db.engine mysql -db.i db.t2.micro -db.user meigh9uK -db.pass Oobohh6f -db.version 5.6.40 -db.size 5
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
注意点
RabbitMQをサービスとして起動する
設定ファイル
.ebextensions/rabbitmq.config
サービスの異常停止時の対応
異常終了時の動作
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)
...
対応
Redisをサービスとして起動する
設定ファイル
.ebextensions/redis.config
サービスの異常停止時の対応
異常終了時の動作
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)
...
対応
[補足] ebextensionsフォルダ内のファイルについて
.ebextensions/rds.config
.ebextensions/storage-efs-mountfilesystem.config
.ebextensions/tomcat-settings.config
.ebextensions/wagby-initloader.config
test: "test ! -e /efs/upload_dir/already_init_db.lck"
.ebextensions/tomcat/copy.sh
.ebextensions/tomcat/change_boot_script.sh
.ebextensions/tomcat/change_db_config.sh
.ebextensions/tomcat/initloader.sh
.ebextensions/tomcat/bin/InitLoader.jar
.ebextensions/tomcat/bin/init_db.sh.ebextensions/tomcat/conf/app_jaas.config.txt
.ebextensions/tomcat/conf/logging.properties
.ebextensions/tomcat/conf/web.xml.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ルートデプロイメントの場合
.ebextensions/tomcat-settings.config
03-change_db_config:
# env:
# WARFILE: "wagby.war"
command: "sh .ebextensions/tomcat/change_db_config.sh"
.ebextensions/wagby-initloader.config