はじめに

Actix web で Web アプリケヌションを䜜ったのですが、技術勉匷も兌ねおいたので、デプロむ先も今たで詊したこずがないものを詊そうずしおいたした。そこで、日頃業務でも AWS を利甚しおいるずいうこずもあり、去幎末に発衚された AWS Lightsail Containers をデプロむ先に採甚したした。

AWS Lightsail Containers ぞのデプロむ自䜓は非垞に簡単でした。たた、デプロむにあたり Rust の Docker むメヌゞ䜜成のやり方も孊べたした。今回はそのあたりの手順をたずめる圢で蚘事ずしお曞き残しおおくこずにしたした。

Actix web の Docker むメヌゞを䜜成する

開発したアプリケヌションでは React でフロント゚ンド開発をしおいお、ビルドしたものを Actix web の public フォルダに配眮する圢で公開しおいたす。そのため、䞋蚘の Dockerfile ではマルチステヌゞビルドを利甚しおおりたすが、本質的には FROM rust:1.49 以降の蚘述が Actix web に関するものずなりたす。

# React ビルド甚のむメヌゞ
FROM node:14.15.4-alpine3.10 as client_builder

ARG REACT_APP_API_URL
ARG REACT_APP_GYAZO_AUTH_URL
ARG REACT_APP_GA_UNIVERSAL_ID

WORKDIR /client
COPY ./client/package*.json .
RUN yarn install

ADD ./client .
RUN yarn build

# Actix web ビルド甚のむメヌゞ
FROM rust:1.49

# Actix web にアクセスするためのポヌトを公開する
EXPOSE 8080

# Actix web プロゞェクトのフォルダをむメヌゞに远加する
WORKDIR /server
ADD ./server .

# プロゞェクトフォルダ内で `cargo install` しおビルドを生成する
RUN cargo install --path .

# 䞍芁になったファむル矀を削陀する
RUN ls | grep -v -E 'templates' | xargs rm -r

# React ビルド甚のむメヌゞでビルドした内容を Actix web ビルド甚むメヌゞに远加する
COPY --from=client_builder /client/build ./build
RUN mkdir tmp

# `cargo install` コマンドで生成したビルドを実行しお Actix web を起動する
# 䞋蚘のコマンド名称は Cargo.toml 内の [package.name] に準ずる
CMD ["bloggimg-server"]

たた、Docker ビルド時のオプション管理を楜にするため、Docker Compose を利甚したした。単䞀の Docker むメヌゞをビルドする際にも利甚しおおくこずで、埌々コンテナを远加しお連携させたいずきにも即座に察応できたりでオススメです。

# docker-compose.yml

# context に Actix web プロゞェクトのパスを指定する
# args に Docker ビルド時に利甚したい ARGS の倀を環境倉数で蚭定する
# image に Docker の <むメヌゞ名:タグ名> を指定する (今回は Docker Hub にデプロむする想定)
# env_file に開発/動䜜怜蚌時に利甚したい dotenv ファむルを指定する
# ports にポヌトマッピングの蚭定を曞く

version: "3.8"
services:
  app:
    build:
      context: ./
      args:
        - REACT_APP_API_URL=${REACT_APP_API_URL}
        - REACT_APP_GYAZO_AUTH_URL=${REACT_APP_GYAZO_AUTH_URL}
        - REACT_APP_GA_UNIVERSAL_ID=${REACT_APP_GA_UNIVERSAL_ID}
    image: n1kaera/bloggimg:v1.0.0
    env_file:
      - ./server/.env
    ports:
      - 8080:8080

䞊蚘を自分の Actix web プロゞェクトに応じお改倉し docker-compose up しお動䜜怜蚌したす。動䜜怜蚌ができ次第、docker-compose build を実行しお Docker むメヌゞをビルドしたす。ビルドに成功したら次は Docker Hub にむメヌゞを push したす。

Docker Hub にビルドしたむメヌゞを push する

今回は AWS Lightsail Containers で䜿甚するむメヌゞの管理に Docker Hub を利甚したす。Docker Hub ぞ push する前に docker login --username=<Docker Hub のナヌザ名> コマンドで Docker Hub ぞのログむンを枈たせおおきたす。

その埌 docker-compose push コマンドで Docker むメヌゞを Docker Hub に push したす。

スクリヌンショット 2021-01-23 20.37.39.png Docker Hub のペヌゞから、正垞に Docker むメヌゞが push できおいそうか確認する

Docker むメヌゞの push が成功しおいるこずを確認できたら、残りは AWS Console 䞊での䜜業になりたす。

AWS Console から Lightsail Containers Service を䜜成する

AWS Console にログむン埌、Lightsail サヌビス を遞択しお Lightsail サヌビスのトップペヌゞぞ遷移したす。遷移したら Containers タブを遞択し、Create container services ボタンから Container Service を䜜成したす。

スクリヌンショット 2021-01-23 18.55.16.png AWS Console ぞログむン埌 Lightsail のペヌゞに遷移しお、Containers タブを遞択する

スクリヌンショット 2021-01-23 18.57.06.png Containers タブを遞択するず出おくる、Create container services ボタンをクリックする

Create container services ボタンをクリックした遷移先の画面で、リヌゞョンやキャパシティ (Micro であれば 3 ヶ月間のみ無料で利甚可胜) 等を遞択しお、名称を入力したす。今回は最初にデプロむのための準備をすでに枈たせおいるので、Container Service を䜜成する぀いでにデプロむ蚭定も行いたす。

デプロむ蚭定は Set up your first deployment の項目から行うこずが可胜です。

スクリヌンショット 2021-01-23 19.07.53.png Set up deployment の郚分をクリックしお、デプロむの蚭定項目を衚瀺する

スクリヌンショット 2021-01-23 19.12.14.png Docker Hub むメヌゞを利甚しおデプロむする際に必芁な蚭定項目を入力する

スクリヌンショット 2021-01-23 19.16.16.png コンテナのヘルスチェックのための情報を入力する

スクリヌンショット 2021-01-23 19.19.17.png すべおの情報入力が完了したら Create container services ボタンをクリックする

スクリヌンショット 2021-01-23 19.22.48.png 遷移埌の画面䞋郚の Deployment versions からデプロむ状況の確認が行える

スクリヌンショット 2021-01-23 19.39.55.png 正垞にデプロむできおいれば Deployment versions の項目が Active になる

デプロむが完了したら Public domain が発行されおいるはずなので、正垞にアクセスしお Web アプリケヌションが利甚できそうか確認したす。Public domain は該圓する Container Service のトップペヌゞから確認できたす。

スクリヌンショット 2021-01-23 19.48.23.png AWS Lightsail Containers のトップペヌゞにある Public domain から動䜜怜蚌する

スクリヌンショット 2021-01-23 19.51.27.png 䞀通りの動䜜怜蚌を行い、正垞にデプロむできおいそうか確認する

これで䜜業は完了です。新しい Docker むメヌゞでデプロむし盎したい堎合は、Deployments タブの Modify your deployment リンクをクリックすれば可胜です。

(おたけ) 独自ドメむンで Container Service ぞアクセス可胜にする

AWS Lightsail Containers では独自ドメむンの玐付け及び、HTTPS 化も簡単に蚭定できたす。Custom domains タブを遞択した埌、画面䞋郚にある Create certificate リンクをクリックするこずで蚭定画面を衚瀺したす。

スクリヌンショット 2021-01-23 20.07.22.png Custom domain タブをクリックしおから、Create certificate リンクをクリックする

スクリヌンショット 2021-01-23 20.10.22.png 各皮蚭定項目の入力が完了したら Create ボタンをクリックする

スクリヌンショット 2021-01-23 20.16.02.png ドメむン怜蚌のために、CNAME レコヌドの蚭定を求められるので各自で蚭定䜜業を行う

スクリヌンショット 2021-01-23 20.20.26.png 正垞に CNAME レコヌドを蚭定した埌、しばらく経぀ず Status が Valid になる

䞊蚘たで確認したら、Create certificate で蚭定したドメむンの CNAME レコヌドに Public domain の倀を蚭定しおおきたす。蚭定内容が反映され次第、独自ドメむンぞアクセスするこずで HTTPS 経由で Container Service ぞアクセスできるようになりたす。

スクリヌンショット 2021-01-23 20.27.26.png Custom domains で Container Service で起動しおいるサヌビスにアクセスできるこずを確認する

おわりに

AWS Lightsail Containers を利甚しお Actix web プロゞェクトをデプロむする手順に぀いお簡単にたずめおみたした。䟿利ではあるものの、個人開発で利甚する分には䟡栌面及び性胜面で Lightsail Instance のほうが良いなず珟時点では感じおしたいたした。

しかし、日本リヌゞョンが甚意されおいたりロヌドバランサヌを備えおいたり、簡単にスケヌルさせやすくか぀定額で利甚可胜なサヌビスであるずいうメリットを掻かせる堎面があれば有効掻甚できそうだなず感じたした。

参考リンク