Spring × Ras Piでセンサから取得したデータを表示する #03AWS編

# 前回までに行ったこと
1. ローカルのPCでDocker上にデータベース構築とSpringでのサーバ構築
1. Ras Pi側でセンサからのデータを取得してdocker内のデータベースにデータ登録

# 今回行うこと
今までローカルのPCで行っていたことをAWSに移行する。

## AWSでdocker&docker-composeを動かす準備＆テスト
### docker部分
[[AWS]EC2内でDockerコンテナを起動して、ブラウザからアクセスする](https://weseek.co.jp/tech/2196/)を参考にHello Worldの表示まで行った。
![スクリーンショット 2023-09-26 165149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/616a6b8e-d08f-4205-7640-f8d913fd042f.png)

### docker-compose部分
さらにここからdocker-composeを導入する。
[EC2（AmazonLinux）にDocker Composeをインストールする](https://qiita.com/maruuuuu/items/7d99cd1230b649591b4f)を参考に導入する。

#### 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できるようになるまで](https://qiita.com/sokon/items/45dc962df1cb25e0da4a)を参考に操作を進める。

参考の記事では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)

```

## 接続確認
EC2のIPアドレス:8080にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/93929242-ee7e-e51e-2d7d-6c58ba4afca8.png)

同じようにIpアドレス:9000にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/1772baec-1a91-9362-b6fb-af71ee69872f.png)

初期データも入っていることが確認できた！＆セキュリティグループでのポート開放も合っていることが確認できた！

## 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のクラウド環境に移行することができた！！

## 動作確認
時間が経った後にEC2のIPアドレス:8080にアクセス
![スクリーンショット 2023-09-29 9.32.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3473187/d80f55b9-0602-b4a1-7da3-31bd47b6d831.png)

ちゃんとグラフが表示された！！
AWSへの移行完了！！！
今回はここまで！！

[第1弾(Spring編)はこちら](https://qiita.com/mrAkito/items/85d2e3d8baa4f7d0a24e)
[第2弾(RasPi編)はこちら](https://qiita.com/mrAkito/items/11c2e29862108d774d58)
[問題解決編(デーモン化)はこちら](https://qiita.com/mrAkito/items/df21d9f77892886e71f7)


### おまけと今後の展望
- docker、docker-composeで立てたコンテナをEC2に移行するのに結構コストの高いインスタンスを借りないと無理かと思っていたけどt2.microの8GiBで正常動作したのがびっくりした。（今後の実装が怖いなぁ、、、）
- RasPiからデータベースに接続してるが、サーバ（Java側）にデータを受け渡して処理をしたい。（Socket通信とか）
- slackのAPIで不快指数の閾値を設定して通知を行うとかやってみたい。
- Azure、GCPでも同じようにできるのか？？メリットやデメリットの違いが気になる。