🙆

Render.com の個人的に便利だと思った機能

2024/12/22に公開

この記事はポート株式会社 サービス開発部 Advent Calendar 2024の22日目の記事です。

はじめに

ポート株式会社でインフラ・SRE 業務をしている井上です。

業務で検証環境の改善のために Render.com を構築する機会がありました。
その際に便利だと思った機能について紹介したいと思います。

今回初めて Render を触ったので、間違いなどありましたらご指摘いただけますと幸いです。

Render の概要

基本的な Render の説明や使い方は他の記事がたくさんあるので、ここではサンプルアプリをデプロイするまでの流れだけを簡単に説明します。

Render は Heroku と似た PaaS で、Blueprint と呼ばれる定義ファイルを元にアプリケーションのデプロイや管理が簡単に行えます。

Blueprint

Blueprint とは YAML 形式のファイルで、Render 上に構築するインフラを IaC として管理するためのものです。
このファイルでは、Web サービスやデータベースなどのリソースの詳細を指定できます。
以下のような感じで設定を記述し、render.yaml という名前でプロジェクトの直下に作成します。

services:
  # Web server
  - type: web
    name: sample_app_web
    plan: starter
    runtime: docker
    dockerfilePath: ./deploy/web/Dockerfile
    dockerContext: ./deploy/web
    preDeployCommand: ./deploy/web/pre_deploy.sh
    envVars:
      # 必要な環境変数の設定
  # DB
  - type: pserv
    name: sample_app_db
    plan: standard
    runtime: docker
    dockerfilePath: ./deploy/db/Dockerfile
    dockerContext: ./deploy/db/
    disk:
      name: mysql
      mountPath: /var/lib/mysql
      sizeGB: 10
    envVars:
      # 必要な環境変数の設定

構築されるリソース

上記の render.yaml をリポジトリに追加して Render に登録すると、そのファイルの内容に基づいてデプロイが実行されます。これにより、以下のようにインスタンスが作成されます。

Render の機能

Render のいろいろな機能の中で、Dockerfile からデプロイする方法と、個人的に便利だと思った Docker Image からデプロイする方法を紹介します。

Dockerfile からデプロイ

まず最初に基本的な使い方の1つとして Dockerfile からビルド & デプロイする方法があります。

設定方法としては、使用したい Dockerfile を render.yaml で指定し push します。
Render はこの Dockerfile を基にイメージをビルド & デプロイを実行してくれます。

    runtime: docker
    dockerfilePath: ./deploy/web/Dockerfile
    dockerContext: ./deploy/web

Docker Image からデプロイ

次に私が便利だと思った機能は、ビルド済の Docker Image を指定してデプロイすることができることです。

公式ドキュメント Deploy a Prebuilt Docker Image によれば、以下が主要なポイントです。

  • Renderは、AWS ECR など、アクセス可能な任意のレジストリからイメージをデプロイできる
  • Docker Image の圧縮サイズは 10GB を超えることはできない

私は AWS ECR に保存されているイメージからデプロイする設定をしたので、その方法について紹介したいと思います。

ECR credential の設定

Render が ECR に接続できるようにするためには、ECR credential の設定が必要です。

設定手順は次の通りです。

  1. Workspace Settings の Container Registry Credentials に移動し、Add Credential をクリックします

  2. 以下のように必要な情報を入力します。このとき、Personal Access Token は aws ecr get-login-password コマンドを実行して取得した値を使用します。

Blueprint

render.yaml には ECR イメージの URI と上で作成した credential を指定します。

    runtime: image
    image:
      url: xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/xxxxxx:latest
      creds:
        fromRegistryCreds:
          name: sample-ecr-credential

ECR Credential のローテート

これで ECR のイメージからデプロイができるようにはなったのですが、aws ecr get-login-password で取得した credential の有効期限が12時間なので、12時間経つと Render から ECR にアクセスできなくなってしまいます。

そのため、12時間ごとに credential を更新する処理を実装します。

具体的には、credential 更新用の API である Update registry credential が提供されてるので、この API を GitHub Actions などを使用して12時間ごとに実行するだけです。

credential=$(aws ecr get-login-password)

curl --request PATCH \
     --url https://api.render.com/v1/registrycredentials/${registryCredentialId} \
     --header 'accept: application/json' \
     --header 'authorization: Bearer ${API Key}' \
     --header 'content-type: application/json' \
     --data '
     {
       "registry": "AWS_ECR",
       "username": "xxxxxxxxxxxx",
       "authToken": "'"$credential"'",
       "name": "sample-ecr-credential"
     }
     '

まとめ

今回 Render を使って検証環境を構築しましたが、Render には様々な機能や API が用意されており、とても便利だなと思いました。
同じように Render を触る方の参考になれたら嬉しいです!

最後まで読んでいただきありがとうございました!

ポート株式会社 エンジニアブログ

Discussion