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 /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