【半日でできる】AWS EC2からHerokuにサーバー移行する方法

## はじめに
ポートフォリオでAWSでデプロイしたが、Herokuに移行したいという人も多いかと思います。

[こちらの記事](https://qiita.com/fujiikayo/items/d0037795f019455bbd71)で紹介したwebアプリをaws ec2にdockerを使って、デプロイをしていたのですが、

- 無料期間にもかかわらず、200円くらい料金がかかる
- ちょこちょこオチていた


Herokuに移行することにしました。

かかった時間は以外にも1日くらいと、結構スムーズにできました。
ざっくりとですが、備忘録がてら自分が移行作業でやったことを載せます。


## herokuにアプリをデプロイ
まず、AWSにデプロイしていたアプリをherokuにデプロイします。
Dockerfileやdocker-compose.ymlを変える必要があると思いますので、適宜変えてください。

ちなみに私はこんな感じでHerokuにデプロイしたと思います。


``` docker-compose.yml
version: "3"
services:
  db:
    image: postgres
    ports:
      - '5432:5432'
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: password
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    tty: true
    stdin_open: true
    depends_on:
      - db
    ports:
      - "3000:3000"
    volumes:
      - .:/my_app

```

``` docker-compose.yml
FROM ruby:2.7

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client yarn vim

RUN mkdir /my_app
WORKDIR /my_app
COPY Gemfile /my_app/Gemfile
COPY Gemfile.lock /my_app/Gemfile.lock
RUN bundle install
COPY . /my_app


COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]
```

ローカルでdocker compose up -dしたら、
Herokuにデプロイしていきます。

```
## コンテナにログイン
heroku container:login

## tsumiki-appというアプリを作成
heroku create tsumiki-app

## tsumiki-appというアプリにコンテナをpush
heroku container:push web --app tsumiki-app

## postgresを追加
heroku addons:create heroku-postgresql:hobby-dev --app tsumiki-app

## tsumiki-appをrelease
heroku container:release web --app tsumiki-app
```

heroku>アプリ>settingで環境変数を定義

```
RAILS_ENV:                production
RAILS_SERVE_STATIC_FILES: true
SECRET_KEY_BASE:          [value]
# S3を使っている人はS3のいろいろも追加
```

```
$heroku config:get ---
```

みたいにしても設定できますが、疲れてたのでheroku上でやりました(実はコマンド苦手意識)
[参考](https://devcenter.heroku.com/articles/config-vars)

つづいて、migrateとprecompileをします。

```
heroku run rails db:migrate --app tsumiki-app

heroku run rails assets:precompile --app tsumiki-app
```

アプリをオープン

```
heroku open --app tsumiki-app
```

無事デプロイできたかと思いましたら、
blocked hostとでたので、それを解消します。

config/application.rbに下記を追加。

```
  config.hosts << "tsumiki-app.herokuapp.com"
```


## dbをdumpし、dumpファイルを作る

続いて、dumpファイルを作ります。
AWSで動かしていたpostgresのdb情報をdumpして、先程作ったherokuアプリに流し込みます。

ec2上にいって、下記を実行します。

```
/usr/local/src/postgresql-12.5/src/bin/pg_dump/pg_dump -U postgres -h `host` -p 5432 `database` -f aws0801.dump
```

ローカルに持ってきます。

```
scp -i (.pem) myuser@ip-address:(ec2上の持ってきたいdumpがある場所) (dumpを持ってきたいローカルのパス)
```

dumpとかscpとかよくわからない方は調べたら後々幸せになれます。笑

## dumpファイルをherokuアプリに流す

流し方は、Heroku推奨のやり方でやってみました↓

### s3からHerokuにアップロードする
S3にダンプをアップロードして、Herokuにアップロードするやり方が推奨されてました。
すみません。これは頑張ってもできなかったのと、海外のサイトでも、できた人いないっぽかったので、おすすめしません。

### 直接流す。

```
heroku pg:psql --app tsumiki-app DATABASE_URL < aws0801.dump
```

まさかのこれでできました。笑


## cloudflareでssl化する
最後に、お名前ドットコムでとった、ドメインに、Herokuの方のドメインを紐付けます。
これで無料でssl化することができます。

下記を読めば簡単にできると思います。

https://qiita.com/serinuntius/items/f7f08b2221f5ad068f5d

https://ryanboland.com/blog/completely-free-easy-to-setup-ssl

### 詰まったところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380952/dc5e09ea-73e8-95df-7665-18d9e9e703e9.png)


上記で、SSLをフルにしないと、ページが開けません。
フレキシブルにしていたので、開けませんでした。

それでは、お気をつけていってらっしゃい。