tag:crieit.net,2005:https://crieit.net/tags/Lightsail/feed 「Lightsail」の記事 - Crieit Crieitでタグ「Lightsail」に投稿された最近の記事 2021-01-23T21:12:04+09:00 https://crieit.net/tags/Lightsail/feed tag:crieit.net,2005:PublicArticle/16645 2021-01-23T21:12:04+09:00 2021-01-23T21:12:04+09:00 https://crieit.net/posts/aws-lightsail-containers-rust-actix-web AWS Lightsail Containers に Actix web をデプロイする <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/actix/actix-web">Actix web</a> で Web アプリケーションを作ったのですが、技術勉強も兼ねていたので、デプロイ先も今まで試したことがないものを試そうとしていました。そこで、日頃業務でも AWS を利用しているということもあり、去年末に発表された <a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/about-aws/whats-new/2020/11/announcing-amazon-lightsail-containers/">AWS Lightsail Containers</a> をデプロイ先に採用しました。</p> <p>AWS Lightsail Containers へのデプロイ自体は非常に簡単でした。また、デプロイにあたり Rust の Docker イメージ作成のやり方も学べました。今回はそのあたりの手順をまとめる形で記事として書き残しておくことにしました。</p> <h1 id="Actix web の Docker イメージを作成する"><a href="#Actix+web+%E3%81%AE+Docker+%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">Actix web の Docker イメージを作成する</a></h1> <p>開発したアプリケーションでは React でフロントエンド開発をしていて、ビルドしたものを Actix web の public フォルダに配置する形で公開しています。そのため、下記の Dockerfile ではマルチステージビルドを利用しておりますが、本質的には <code>FROM rust:1.49</code> 以降の記述が Actix web に関するものとなります。</p> <pre><code class="Dockerfile"># 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"] </code></pre> <p>また、<strong>Docker ビルド時のオプション管理を楽にするため、Docker Compose を利用しました。単一の Docker イメージをビルドする際にも利用しておくことで、後々コンテナを追加して連携させたいときにも即座に対応できたりでオススメです。</strong></p> <pre><code class="yml"># docker-compose.yml # context に Actix web プロジェクトのパスを指定する # args に Docker ビルド時に利用したい ARGS の値を環境変数で設定する # image に Docker の &lt;イメージ名:タグ名&gt; を指定する (今回は 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 </code></pre> <p>上記を自分の Actix web プロジェクトに応じて改変し <code>docker-compose up</code> して動作検証します。動作検証ができ次第、<code>docker-compose build</code> を実行して Docker イメージをビルドします。ビルドに成功したら次は Docker Hub にイメージを push します。</p> <h1 id="Docker Hub にビルドしたイメージを push する"><a href="#Docker+Hub+%E3%81%AB%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%9F%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92+push+%E3%81%99%E3%82%8B">Docker Hub にビルドしたイメージを push する</a></h1> <p>今回は AWS Lightsail Containers で使用するイメージの管理に <a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/">Docker Hub</a> を利用します。Docker Hub へ push する前に <code>docker login --username=<Docker Hub のユーザ名></code> コマンドで Docker Hub へのログインを済ませておきます。</p> <p>その後 <code>docker-compose push</code> コマンドで Docker イメージを Docker Hub に push します。</p> <p><img src="https://i.gyazo.com/06ce4ca43a26c73c227b9eb768f65685.png" alt="スクリーンショット 2021-01-23 20.37.39.png" /><br /> <strong>Docker Hub のページから、正常に Docker イメージが push できていそうか確認する</strong></p> <p>Docker イメージの push が成功していることを確認できたら、残りは AWS Console 上での作業になります。</p> <h1 id="AWS Console から Lightsail Containers Service を作成する"><a href="#AWS+Console+%E3%81%8B%E3%82%89+Lightsail+Containers+Service+%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">AWS Console から Lightsail Containers Service を作成する</a></h1> <p>AWS Console にログイン後、<a target="_blank" rel="nofollow noopener" href="https://lightsail.aws.amazon.com/ls/webapp/home/containers">Lightsail サービス</a> を選択して Lightsail サービスのトップページへ遷移します。遷移したら Containers タブを選択し、<code>Create container services</code> ボタンから Container Service を作成します。</p> <p><img src="https://i.gyazo.com/42a8e6fa6224a6a52212cdb7461a8515.png" alt="スクリーンショット 2021-01-23 18.55.16.png" /><br /> <strong>AWS Console へログイン後 Lightsail のページに遷移して、Containers タブを選択する</strong></p> <p><img src="https://i.gyazo.com/25c1b55863c4d77249d3105ba7a97afd.png" alt="スクリーンショット 2021-01-23 18.57.06.png" /><br /> <strong>Containers タブを選択すると出てくる、<code>Create container services</code> ボタンをクリックする</strong></p> <p><code>Create container services</code> ボタンをクリックした遷移先の画面で、リージョンやキャパシティ (Micro であれば 3ヶ月間のみ無料で利用可能) 等を選択して、名称を入力します。今回は最初にデプロイのための準備をすでに済ませているので、Container Service を作成するついでにデプロイ設定も行います。</p> <p>デプロイ設定は <code>Set up your first deployment</code> の項目から行うことが可能です。</p> <p><img src="https://i.gyazo.com/e8e4ab4e3b29afaf6298f7eb75355c34.png" alt="スクリーンショット 2021-01-23 19.07.53.png" /><br /> <strong><code>Set up deployment</code> の部分をクリックして、デプロイの設定項目を表示する</strong></p> <p><img src="https://i.gyazo.com/da0fd3ce440f441082a367a0dfe350b6.png" alt="スクリーンショット 2021-01-23 19.12.14.png" /><br /> <strong>Docker Hub イメージを利用してデプロイする際に必要な設定項目を入力する</strong></p> <p><img src="https://i.gyazo.com/eefec162ec66adab937d5139f70763cc.png" alt="スクリーンショット 2021-01-23 19.16.16.png" /><br /> <strong>コンテナのヘルスチェックのための情報を入力する</strong></p> <p><img src="https://i.gyazo.com/0c532eb818754d554a61028f6a177dde.png" alt="スクリーンショット 2021-01-23 19.19.17.png" /><br /> <strong>すべての情報入力が完了したら <code>Create container services</code> ボタンをクリックする</strong></p> <p><img src="https://i.gyazo.com/102978a025c8babbba40886e1b551ae6.png" alt="スクリーンショット 2021-01-23 19.22.48.png" /><br /> <strong>遷移後の画面下部の <code>Deployment versions</code> からデプロイ状況の確認が行える</strong></p> <p><img src="https://i.gyazo.com/eaaf0b1f1d2b2d37807d49764cafa681.png" alt="スクリーンショット 2021-01-23 19.39.55.png" /><br /> <strong>正常にデプロイできていれば <code>Deployment versions</code> の項目が Active になる</strong></p> <p>デプロイが完了したら <code>Public domain</code> が発行されているはずなので、正常にアクセスして Web アプリケーションが利用できそうか確認します。<code>Public domain</code> は該当する Container Service のトップページから確認できます。</p> <p><img src="https://i.gyazo.com/9ee36e7f1018c47a9c12e51ebe6df6d0.png" alt="スクリーンショット 2021-01-23 19.48.23.png" /><br /> <strong>AWS Lightsail Containers のトップページにある <code>Public domain</code> から動作検証する</strong></p> <p><img src="https://i.gyazo.com/a381f52745c002ce47addf7721b7ec0b.png" alt="スクリーンショット 2021-01-23 19.51.27.png" /><br /> <strong>一通りの動作検証を行い、正常にデプロイできていそうか確認する</strong></p> <p>これで作業は完了です。新しい Docker イメージでデプロイし直したい場合は、<code>Deployments</code> タブの <code>Modify your deployment</code> リンクをクリックすれば可能です。</p> <h1 id="(おまけ) 独自ドメインで Container Service へアクセス可能にする"><a href="#%28%E3%81%8A%E3%81%BE%E3%81%91%29+%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A7+Container+Service+%E3%81%B8%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%99%E3%82%8B">(おまけ) 独自ドメインで Container Service へアクセス可能にする</a></h1> <p>AWS Lightsail Containers では独自ドメインの紐付け及び、HTTPS 化も簡単に設定できます。<code>Custom domains</code> タブを選択した後、画面下部にある <code>Create certificate</code> リンクをクリックすることで設定画面を表示します。</p> <p><img src="https://i.gyazo.com/93019714418209872be82c396931beee.png" alt="スクリーンショット 2021-01-23 20.07.22.png" /><br /> <strong><code>Custom domain</code> タブをクリックしてから、<code>Create certificate</code> リンクをクリックする</strong></p> <p><img src="https://i.gyazo.com/b6cc81261f5d3bec4b236e04c0409372.png" alt="スクリーンショット 2021-01-23 20.10.22.png" /><br /> <strong>各種設定項目の入力が完了したら <code>Create</code> ボタンをクリックする</strong></p> <p><img src="https://i.gyazo.com/d8075a0e1eedeb1e518e7f0ae22554a1.png" alt="スクリーンショット 2021-01-23 20.16.02.png" /><br /> <strong>ドメイン検証のために、CNAME レコードの設定を求められるので各自で設定作業を行う</strong></p> <p><img src="https://i.gyazo.com/3aa4608c22ab83193d75b3e968d47b77.png" alt="スクリーンショット 2021-01-23 20.20.26.png" /><br /> <strong>正常に CNAME レコードを設定した後、しばらく経つと Status が Valid になる</strong></p> <p>上記まで確認したら、<code>Create certificate</code> で設定したドメインの CNAME レコードに <code>Public domain</code> の値を設定しておきます。設定内容が反映され次第、独自ドメインへアクセスすることで HTTPS 経由で Container Service へアクセスできるようになります。</p> <p><img src="https://i.gyazo.com/21d69cbc2370b588e01cfae43afa50ca.png" alt="スクリーンショット 2021-01-23 20.27.26.png" /><br /> <strong><code>Custom domains</code> で Container Service で起動しているサービスにアクセスできることを確認する</strong></p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>AWS Lightsail Containers を利用して Actix web プロジェクトをデプロイする手順について簡単にまとめてみました。便利ではあるものの、個人開発で利用する分には価格面及び性能面で Lightsail Instance のほうが良いなと現時点では感じてしまいました。</p> <p>しかし、日本リージョンが用意されていたりロードバランサーを備えていたり、簡単にスケールさせやすくかつ定額で利用可能なサービスであるというメリットを活かせる場面があれば有効活用できそうだなと感じました。</p> <h1 id="参考リンク"><a href="#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/blogs/news/lightsail-containers-an-easy-way-to-run-your-containers-in-the-cloud/">Lightsail コンテナ: クラウドでコンテナを実行する簡単な方法 | Amazon Web Services ブログ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/rust">rust - Docker Hub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-enabling-distribution-custom-domains">Enabling custom domains for your Amazon Lightsail distributions | Lightsail Documentation</a></li> </ul> nikaera