docker-compose環境でRuby on Jetsの構築からデプロイまで<後編>

## 概要

以前の記事でRuby on Jetsのローカル環境を作成するところまで書きました。

[docker-compose環境でRuby on Jetsの構築からデプロイまで<前編>](https://qiita.com/takashi-5/items/74b8ac4a342ae7372205)

今回は実際にデプロイするところまでまとめてみたいと思います。

## ユーザを準備

コンソールからIAMユーザを作成し、credentialを取得してください。

[https://console.aws.amazon.com/iam/home#/users](https://console.aws.amazon.com/iam/home#/users)

今回デプロイするためだけのユーザということで「プログラムによるアクセス」にチェックを入れます。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923148/7649b37b-4e94-b873-4b58-6572387483c0.png)

ポリシーの作成では「JSON」というタブを押して以下に記述したjsonを貼り付けてください。

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923148/cee8826d-2fec-50cf-cfe9-de76cd182c9b.png)

ポリシー設定用json

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "apigateway:*",
                "cloudformation:*",
                "dynamodb:*",
                "events:*",
                "iam:*",
                "lambda:*",
                "logs:*",
                "route53:*",
                "s3:*"
             ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

便宜上フルでアクションを許可しました。

もしセキュリティ視点でIAMポリシーを最小限にしたい場合は

以下のページを参考にデプロイ用IAMユーザにポリシーを設定してください。

(自分は最小限で設定しました。)

[https://rubyonjets.com/docs/extras/minimal-deploy-iam/](https://rubyonjets.com/docs/extras/minimal-deploy-iam/)

公式ドキュメントには現時点では載っていなかったのですがVPCを設定するためには以下のような記述を追加する必要があると思います(というより記述しないとapplication.rbに書いたVPCの設定でデプロイが落ちました。。)

```bash
# Statementに追加
{
    "Version": "2012-10-17",
    "Statement": [
        {
            中略
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

ここでは説明を省きますが、注意点としてはこのIAMポリシーは関数ロールに設定するIAMポリシーとは異なるという点です。config/application.rbの方で関数ロールへIAMポリシーをアタッチできます。気が向いたらそちらも書く予定です。

好みの名前を入力してポリシーを作成します。

![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923148/ab7f3898-c36a-c048-bcda-e4280ecc0acf.png)

この後はお好みの設定でユーザを作成してください。

## credentialをローカルに設定

IAMコンソールで作成したIAMユーザの画面へ行き、「認証情報」タブからアクセスキーとシークレットキーを作成してください。

取得した２つのキーを、以下を参考に~/.aws/credentialsと~/.aws/configに設定します。

[https://rubyonjets.com/docs/deploy/](https://rubyonjets.com/docs/deploy/)

~/.aws/credentials:

```json
[default]
aws_access_key_id=<アクセスキー>
aws_secret_access_key=<シークレットキー>
```

~/.aws/config:

```json
[default]
region=<リージョン>
output=json
```

## デプロイ実行

デプロイにはjets deployというコマンドを使います。ちなみに裏ではcloud formationが動いています。

dockerコンテナからそのままデプロイします。

ちなみに①で記述したDockerfileでaws-cliがコンテナに入っている状態になっています。

(①の方でDockerfileやdocker-compose.ymlの設定を載せています)

.env.containerでコンテナの環境変数を管理しているのでここにENVを記述します。

```bash
# .env.container
JETS_ENV = production
```

次に.env.production.remoteにDB情報などの、関数で使うための環境変数を記述します

(.env.developmentはローカル用、.env.development.remoteはリモート用でstagingとprodも同様)

```bash
# .env.production.remote
# DB情報などを記述
```

後はdeployするだけです！

```bash
$ docker-compose run --rm app bundle exec jets deploy
```

lambdaコンソールからアプリケーションがデプロイされているのを確認できれば完了です！

[https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/applications](https://ap-northeast-1.console.aws.amazon.com/lambda/home?region=ap-northeast-1#/applications)

## staging環境を作成する

jetsでは先ほど記述したJETS_ENVという環境変数によって別の環境を簡単に作れます

以下のように.envなどに設定してみます

```
# .env.container
JETS_ENV=staging
```

先程と同様にdeployします

この時関数の環境変数は.env.staging.remoteに記述しましょう

```shell
$ docker-compose run --rm app bundle exec jets deploy
```

環境を入れ替えたいときはJETS_ENVの値を変えるだけでいいのでCI/CDの構築も

環境変数を切り替えてあげるだけで大丈夫です！

## アプリケーションの削除

以下のコマンドでアプリケーションに依存しているリソース全てを消すことができます

扱いには注意が必要です

```shell
$ docker-compose run --rm app bundle exec jets delete
```

[https://rubyonjets.com/reference/jets-delete/](https://rubyonjets.com/reference/jets-delete/)

## まとめ

まだまだ書きたいことがたくさんあるのですが、とりあえずデプロイするところまで

行けました！！

引き続き気づいたことや詰まったことは発信していきたいと思います。