AWS App RunnerにGitHub Actionワークフローでアプリケーションをデプロイするステップバイステップガイド

プライバシープロテクト

chromeやsafariのようなデスクトップやモバイルWebブラウザーを使って、メールでパスワードや機密ファイルを共有したり、クラウドドライブなどの安全でない場所に保存するのはやめましょう。

特別なソフトウェアは必要ありません。アカウントを作成する必要もありません。無料でオープンソース、プライベートなデータは秘密のまま、そして邪魔しません。

App Runner

AWS App Runnerは、インフラストラクチャやコンテナの経験がなくても、コンテナ化されたWebアプリケーションやAPIサービスを構築、デプロイ、実行できる完全マネージドコンテナアプリケーションサービスです。

App Runnerのデメリット

EFSマウントのサポートがない:

Elastic File System (EFS)をマウントするサポートがありません。代わりにAWSは、データストレージを扱うための代替ソリューションであるDynamoDBを提供しています。EFSマウントのサポートの不足は、一部のユースケースでは課題になるかもしれません:限定されたファイルストレージの柔軟性、潜在的なパフォーマンスへの影響、追加の設定の複雑さ。しかし、AWSの代替ストレージソリューションであるDynamoDBを活用することで、開発者はこの制限を乗り越え、スケーラブルなアプリケーションを構築することができます。

このアーキテクチャ図を見てください。

画像説明

IAMロールの作成

このロールは、AWS App RunnerがAWS ECRのDockerイメージにアクセスするために使われます。

サービスロールを作成し、AWSAppRunnerServicePolicyForECRAccessポリシーを関連付ける手順を以下に示します。

ステップ1
app-runner-service-roleという名前のロールを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "build.apprunner.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ステップ2
既存のポリシーAWSAppRunnerServicePolicyForECRAccessをロールapp-runner-service-roleにアタッチします。

GitHub Actionを使用してApp RunnerにPrivacy-Protectアプリケーションをデプロイする手順はこちらです

AWS ECRプライベートリポジトリの作成

画像説明

リポジトリのクローン

git clone https://github.com/r4jeshwar/privacy-protect.git
cd privacy-protect

サーバーデプロイメントから静的サイトジェネレーターへの移行

まず、npm i -D @sveltejs/adapter-staticをインストールします。

ステップ1で作成したapp-runner-service-roleロールに、AWSAppRunnerServicePolicyForECRAccessという既存のポリシーをアタッチしてください。

GitHub Actionを使用してApp Runnerにプライバシープロテクトアプリケーションをデプロイする手順は以下のとおりです。

AWS ECRプライベートリポジトリの作成

画像の説明

リポジトリのクローン

git clone https://github.com/r4jeshwar/privacy-protect.git
cd privacy-protect

サーバーデプロイメントから静的サイトジェネレーター(Vercel-@sveltejs/adapter-vercelから@sveltejs/adapter-staticへ)への移行

まず、npm i -D @sveltejs/adapter-staticをインストールします。

ステップ2で作成したsvelte.config.jsファイルの既存の内容を削除し、以下の内容をsvelte.config.jsファイルに貼り付けます。

import adapter from "@sveltejs/adapter-static";
import { vitePreprocess } from "@sveltejs/kit/vite";
import { mdsvex } from "mdsvex";
import { resolve } from "path";

/** @type {import('@sveltejs/kit').Config} */
export default {
  extensions: [".md", ".svelte"],
  kit: {
    adapter: adapter({
       pages: 'build',
       assets: 'build',
      fallback: null,
      precompress: false,
      strict: true
    }),
    alias: {
      $components: resolve("src/components"),
      $icons: resolve("src/assets/icons"),
    },
    csp: {
      directives: {
        "base-uri": ["none"],
        "default-src": ["self"],
        "frame-ancestors": ["none"],
        "img-src": ["self", "data:"],
        "object-src": ["none"],
        // See https://github.com/sveltejs/svelte/issues/6662
        "style-src": ["self", "unsafe-inline"],
        "upgrade-insecure-requests": true,
        "worker-src": ["none"],
      },
      mode: "auto",
    },
  },
  preprocess: [
    mdsvex({
      extensions: [".md"],
      layout: {
        blog: "src/routes/blog/post.svelte",
      },
    }),
    vitePreprocess(),
  ],
};

注: この変更は、さまざまなインフラストラクチャにデプロイし、小さいサイズでdockerizeするためです。Vercelにデプロイする必要がある場合は、この部分を無視してください。

なぜAdapter-VercelからAdapter-Staticに移行する必要があるのですか?

Adapter-Staticを使用すると、Vite.jsアプリケーションをさまざまな静的ホスティングプロバイダーにデプロイできます。また、Vercelに特有のサーバーレスインフラストラクチャや設定を必要としないため、デプロイプロセスが簡素化されます。

全体的に、Adapter-VercelからAdapter-Staticへの移行により、柔軟性とシンプルさが向上します。

App RunnerでデプロイするプライバシープロテクトのためのDockerfile

FROM node:18-alpine as build

WORKDIR /app

COPY . .

RUN npm i
RUN npm run build


FROM nginx:stable-alpine

COPY --from=build /app/build/ /usr/share/nginx/html

GHワークフローが次に認識する変更をリポジトリにプッシュします

GitHub Actionのシークレットを設定する

プロジェクトリポジトリに移動し、「settings」からセキュリティセクションにある「Secrets and variables」ドロップダウンをクリックし、「Actions」をクリックします。変数を設定します。

画像説明

  • AWS_ACCESS_KEY_IDはAWSユーザーのアクセスキーです。

  • AWS_SECRET_ACCESS_KEYはAWSユーザーのシークレットキーです。

  • AWS_REGIONはAWSサービスを作成するリージョンです。

  • ROLE_ARNはあなたが作成したIAMロールARNで、app-runner-service-roleと名付けたものです。

GitHub Actionで新しいワークフローを設定する

「自分でワークフローを設定する」をクリックします。

画像説明

次に、ファイルエディター(main.yml)に以下のYAMLファイルを入力します。

name: Deploy to App Runner - Image based # ワークフローの名前
on:
  push:
    branches: [ main ] # mainブランチへのgit pushでワークフローをトリガー
  workflow_dispatch: # ワークフローの手動起動を許可
jobs:  
  deploy:
    runs-on: ubuntu-latest

    steps:      
      - name: Checkout
        uses: actions/checkout@v2
        with:
          persist-credentials: false

      - name: Configure AWS credentials
        id: aws-credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@v1        

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          ECR_REPOSITORY: privacy-protect
          IMAGE_TAG: ${{ github.sha }}
        run: |
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"  

      - name: Deploy to App Runner
        id: deploy-apprunner
        uses: awslabs/amazon-app-runner-deploy@main        
        with:
          service: privacy-protect-app-runner
          image: ${{ steps.build-image.outputs.image }}          
          access-role-arn: ${{ secrets.ROLE_ARN }}       
          region: ${{ secrets.AWS_REGION }}
          cpu : 1
          memory : 2
          port: 80
          wait-for-service-stability: true

      - name: App Runner ID
        run: echo "App runner ID ${{ steps.deploy-apprunner.outputs.service-id }}"

数分後にGitHub Actionが正常に実行される

AWS App Runnerダッシュボードで、あなたのアプリケーションが成功裏に稼働していることが確認できます。

画像説明

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/ittrident/a-step-by-step-guide-to-deploying-an-application-on-aws-app-runner-with-github-action-workflow-17ke