前回までに行ったこと
- ローカルのPCでDocker上にデータベース構築とSpringでのサーバ構築
- Ras Pi側でセンサからのデータを取得してdocker内のデータベースにデータ登録
今回行うこと
今までローカルのPCで行っていたことをAWSに移行する。
AWSでdocker&docker-composeを動かす準備&テスト
docker部分
[AWS]EC2内でDockerコンテナを起動して、ブラウザからアクセスするを参考にHello Worldの表示まで行った。
docker-compose部分
さらにここからdocker-composeを導入する。
EC2(AmazonLinux)にDocker Composeをインストールするを参考に導入する。
docker-composeのバージョン確認&起動確認
[ec2-user@docker-app-ec2 ~]$ docker-compose -v
docker-compose version 1.24.0, build 0aa59064
dockerを起動する
[ec2-user@docker-app-ec2 ~]$ sudo systemctl start docker
[ec2-user@docker-app-ec2 ~]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2023-09-27 02:19:32 UTC; 14s ago
Docs: https://docs.docker.com
たぶん/usr/lib/systemd/system/docker.service; disabled
が自動起動の設定で今は無効になっているので自動起動を有効化する。
[ec2-user@docker-app-ec2 ComfortServiceDemo]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[ec2-user@docker-app-ec2 ComfortServiceDemo]$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-09-27 02:19:32 UTC; 5min ago
Docs: https://docs.docker.com
自動起動の設定が完了!!
コンテナの自動起動は行わない。(今後追加実装したときに処理落ちすると大変そうなので、、)
git上で保管しているリポジトリからpull、cloneする
$ sudo yum install git
$ git version
git version 2.40.1
git導入後、単純にgit clone ~~
でリポジトリを引っ張ろうとすると認証エラーがでた(おそらく原因はプライベートリポジトリをcloneしようとしたため)のでその解決からいこう!!
ec2にgitをインストールしてgithubからgit pullできるようになるまでを参考に操作を進める。
参考の記事ではSSH鍵生成の時にsudo
で行っているが、自分がやった際にはsudo
なしでできた。
SSH鍵作成
ssh-keygen -t ed25519 -C 「自分のメールアドレス」
vi /home/ec2-user/.ssh/id_ed25519.pub
ssh -T git@github.com
##############
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
実際にpullしてcloneを作成する
[ec2-user@docker-app-ec2 ~]$ git clone git@github.com:mrAkito/ComfortServiceDemo.git
[ec2-user@docker-app-ec2 ~]$ ls
ComfortServiceDemo hello-world-docker
ComfortServiceDemoのclone作成が完了した
コンテナを起動する
[ec2-user@docker-app-ec2 ~]$ cd ComfortServiceDemo/
[ec2-user@docker-app-ec2 ComfortServiceDemo]$ docker-compose up -d
Starting db ... done
Starting adminer ... done
Starting app ... done
[ec2-user@docker-app-ec2 ComfortServiceDemo]$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------
adminer entrypoint.sh docker-php-e ... Up 0.0.0.0:9000->8080/tcp,:::9000->8080/tcp
app jshell Up 0.0.0.0:8080->8080/tcp,:::8080->8080/tcp
db docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp,:::5432->5432/tcp
コンテナが起動していることが確認できた!!
起動したのでアプリ内に入ってビルド&Spring起動
[ec2-user@docker-app-ec2 ComfortServiceDemo]$ docker-compose exec app bash
root@60bb7ca4faa7:/srv# sh gradlew build
Starting a Gradle Daemon, 1 incompatible and 2 stopped Daemons could not be reused, use --status for details
BUILD SUCCESSFUL in 19s
7 actionable tasks: 7 up-to-date
root@60bb7ca4faa7:/srv# java -jar build/libs/app-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.15)
2023-09-28 04:42:45.391 INFO 146 --- [ main] com.example.app.AppApplication : Starting AppApplication using Java 11.0.16 on 60bb7ca4faa7 with PID 146 (/srv/build/libs/app-0.0.1-SNAPSHOT.jar started by root in /srv)
2023-09-28 04:42:45.399 INFO 146 --- [ main] com.example.app.AppApplication : No active profile set, falling back to 1 default profile: "default"
2023-09-28 04:42:48.464 INFO 146 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2023-09-28 04:42:48.494 INFO 146 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2023-09-28 04:42:48.496 INFO 146 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.79]
2023-09-28 04:42:48.723 INFO 146 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2023-09-28 04:42:48.727 INFO 146 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3202 ms
2023-09-28 04:42:50.476 INFO 146 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2023-09-28 04:42:50.985 INFO 146 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2023-09-28 04:42:51.016 INFO 146 --- [ main] com.example.app.AppApplication : Started AppApplication in 6.852 seconds (JVM running for 7.999)
接続確認
初期データも入っていることが確認できた!&セキュリティグループでのポート開放も合っていることが確認できた!
Ras Piからのデータベース接続情報を変更する
Raspberry PiのInsertInfo.py
を一部変更する
データベース接続処理のhost
をEC2のIPアドレスに変更する
#データベース接続処理
def InsertInit():
constr = "host='52.68.157.245' port=5432 dbname=dev user=root password='root'"
connect = psycopg2.connect(constr)
cursor = connect.cursor()
return cursor, connect
これでローカル環境でたてたdocker内のwebアプリケーションをAWSのクラウド環境に移行することができた!!
動作確認
ちゃんとグラフが表示された!!
AWSへの移行完了!!!
今回はここまで!!
第1弾(Spring編)はこちら
第2弾(RasPi編)はこちら
問題解決編(デーモン化)はこちら
おまけと今後の展望
- docker、docker-composeで立てたコンテナをEC2に移行するのに結構コストの高いインスタンスを借りないと無理かと思っていたけどt2.microの8GiBで正常動作したのがびっくりした。(今後の実装が怖いなぁ、、、)
- RasPiからデータベースに接続してるが、サーバ(Java側)にデータを受け渡して処理をしたい。(Socket通信とか)
- slackのAPIで不快指数の閾値を設定して通知を行うとかやってみたい。
- Azure、GCPでも同じようにできるのか??メリットやデメリットの違いが気になる。