【AWS】デプロイ関連で詰まった箇所

# デプロイ

## bundler: failed to load command: puma

### 解決法
[参考記事](https://qiita.com/Esfahan/items/489677a673e9c200686b)

## AssetsPrecompile関連エラー

Precompile = 1つのファイルにまとめる(圧縮する作業) 

```:ターミナル
# アセッツプリコンパイル
$ bundle exec rake assets:precompile RAILS_ENV=production
```

### 解決法

#### yarnのインストール

```console:ターミナル
$ curl -o- -L https://yarnpkg.com/install.sh | bash
$ source ~/.bashrc # 反映
$ yarn -V # yarnインストール
```

```ruby:config/environments/production.rb
config.assets.js_compressor = :uglifier

# 変更

config.assets.js_compressor = Uglifier.new(harmony: true)
```

```ruby:config/environments/production.rb
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

# 変更

config.public_file_server.enabled = true
```

## capistrano関連エラー

### SSHKit::Runner::ExecuteError

```ruby:config/deploy/production.rb
set :ssh_options, {
  keys: %w(~/.ssh/id_rsa)
}

# 変更(例)

set :ssh_options, {
  keys: %w(/Users/hogehogehoge/.ssh/hogehoge_key_rsa)
}

# ①ssh接続の秘密鍵にはデフォルトでid_rsaを探しにいくため、使用する秘密鍵の名前に変更
# ②使用する秘密鍵の場所までのpathを通す

```

[参考記事](https://qiita.com/Takkiii/items/c4f2cfd143e97e061e66)


### Gem::LoadError : "ed25519 is not part of the bundle. Add it to your Gemfile."

```Gemfile:Gemfile
gem 'ed25519'
gem 'bcrypt_pbkdf'
```

```console:ターミナル
$ bundle
```

使ってるパソコンの環境によってエラーが出たり出なかったりするらしい。

### bundle exec cap production deploy(git:checkで落ちる)

```ruby:Gemfile
# ssh形式で接続
set :repo_url, "git@github.com:hogehogehoge.git"

# 変更

# https形式で接続
set :repo_url, "https://github.com/hoge/hogehogehoge.git"
set :git_http_username, "gitに登録しているusername"
set :git_http_password, "gitに登録した公開鍵パスワード"
```

### bundle exec cap production deploy(deploy:symlink:linked_filesで落ちる)

`master.key database.yml settings.yml`の配置を変更

`/var/www/rails/アプリケーション/shared/config`配下に移動

### bundle exec cap production deploy(yarn:installで落ちる)

nodeのバージョンが古かったらしい

[参考記事](https://www.yoshinani.com/tech_blogs/3)

### bundle exec cap production deploy(nginx:restartで落ちる)

```console:ターミナル
$ ps aux | grep nginx
→プロセスを確認してnginxが起動していないか確認
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] open() "/var/www/rails/アプリケーション名/log/nginx.error.log" failed (2: No such file or directory)
→nginx.conf(nginx設定ファイル)は問題ない
→/var/www/rails.......にnginx.error.logがあるか確認してくださいと言われるが、nginx.error.logは/var/www/rails/アプリケーション名/sheard/log/nginx.error.logに配置したいため/etc/nginx/sites-enabled/アプリケーション名を書き換える
```

```console:ターミナル
[~]$ cd /etc/nginx/sites-enabled
$ sudo vim アプリケーション名
```

```vim:sites-enabled/アプリケーション名
error_log /var/www/rails/アプリケーション名/sheard/log/nginx.error.log
access_log /var/www/rails/アプリケーション名/sheard/log/nginx.access.log
```

```console:ターミナル
$ sudo service nginx start
→ 起動確認
```

### bundle exec cap production deploy(全て通ったのにブラウザで画面表示されない)

`nginx.error.log`
`puma.error.log`
`production.log`
を確認してエラーが出ているか確認。

`nginx.error.log`場所確認

```console:ターミナル
/etc/nginx/sites-enabled/アプリケーション
```

vimで開いて中身を確認
自分の場合は`/var/www/rails/アプリケーション名/shared/log/nginx.error.log`に配置

注意))あくまで読み込むのは`/etc/nginx/nginx.conf`であるため`nginx.conf`に`include /etc/nginx/sites-enabled/*`のようにincludeされているかを確認。

nginx関連で見るファイルは基本的に**<font color="Red">nginx.confとsites-enabled配下のファイル</font>**の2つ

`puma.error.log`場所確認

ローカル環境の

```ruby:config/deploy.rb
set :puma_error_log の後にパスが記述
```

自分の場合は
`/var/www/rails/アプリケーション名/shared/log/puma.error.log`に配置

error.logは他の開発者とも共有しやすいように**<font color="Red">shared(シェアード)配下に置くのが一般的</font>**なのでそのように設定しておくのがベター

`production.log`も`shared配下`に配置

今回のエラーは`/etc/nginx/sites-enabled`配下にcapistranoでデプロイ以前に作成した`.confファイル`が残っておりそちらのファイルが`nginx.conf`に`include`
されており、間違った設定が適用されていたことが原因だった。

`sites-enabled/.conf`を削除し、`nginx.conf`に記載の`include`を削除することで解決。

# AWSアーキテクチャ関連

## 複数サーバーにcapistranoでデプロイしたい時

元々あるWebサーバーからイメージの作成、EC2インスタンスを起動し、**ローカルの**

```ruby:config/deploy/production.rb
role app, 'ユーザー名@パブリックIP'
role web, 'ユーザー名@パブリックIP'
role db, 'ユーザー名@パブリックIP'
```
を追加して

```console:ターミナル
$ bundle exec cap production deploy
```

で、OK

## SSL証明書発行(albに付与)

[参考記事](https://aws.amazon.com/jp/premiumsupport/knowledge-center/associate-acm-certificate-alb-nlb/)の7まで進めたら、最下部の`新しい ACM 証明書をリクエスト`をクリック。

`*.ドメイン名`と`ドメイン名`を記入し、次へ
検証方法はDNS
証明書が認証されるまで待って、リスナー画面へ戻り、発行された証明書を選択して保存

※ Udymy`AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得`のセクション8の`62.CloudFrontを設定して高速化しよう`が参考になる。

```ruby:ローカルのconfig/deploy/templates/nginx_conf.erb
# bundle exec rails g capistrano:nginx_puma:configをした時に自動生成されるファイル
# デプロイすると、このファイルを元にEC2インスタンスの/etc/nginx/nginx.confや/etc/nginx/sites-enabled/アプリケーションに設定が反映される

location @puma_<%= fetch(:nginx_config_name) %> {
...

<% if fetch(:nginx_use_ssl) -%>
    proxy_set_header X-Forwarded-Proto https;
<% else -%>
    proxy_set_header X-Forwarded-Proto http;
<% end -%>

↓ 変更

proxy_set_header X-Forwarded-Proto https;
```

この作業をしないとPOSTリクエストがhttpsの時はできないので要注意
[https://www.cotegg.com/blog/?p=1850](https://www.cotegg.com/blog/?p=1850)

# Git

## プッシュ済みコミット取り消し、ローカルの状態をプッシュ

プッシュ済みコミット取り消し

```console:ターミナル
$ git log
戻したいコミットの地点のIDをコピー
$ git reset --hard ID
```

ローカルの状態をプッシュ
リモートの方がコミットが進んでるためrejectするので

```console:ターミナル
$ git push -f origin master
ローカルの状態を最新としてリモートを更新
```

チーム開発時の `-f`は要注意