【初心者向け】App Runner使ってみた

# はじめに
　こんにちは。タイトルのとおり、App Runnerを使ってみた記事になります。
　App Runnerがどういったサービスなのかざっくり言うと、VPCなどのインフラ側の構成をAWS側でいい感じにやってくれて、アプリケーションの構築とデプロイができるサービスです。
　もし、EC2やEKSでアプリケーションを構築する場合、VPCやサブネット、セキュリティグループなどネットワーク関係の構築は必須ですが、App Runnerではネットワーク関係をAWS側でやってくれます！なんて便利！！そんなサービスになります。詳細は、[公式ドキュメント](https://docs.aws.amazon.com/apprunner/latest/dg/what-is-apprunner.html)をご確認ください。　

# 構築手順
　早速ですが、App Runnerの構築手順を紹介します。大まかな流れは下記になります。あくまでも「とりあえず動かしてみた。」のレベルになりますのでご留意ください。
 
* ECR作成
* Cloud9構築　(今回はイメージ作成をCloud9から行います。)
* Cloud9からイメージをプッシュ
* App Runner構築

　※当たり前ですが、何かの案件などで用いる場合は、可用性、セキュリティなど要件を満たすように注意しましょう。

## ECR作成
　ECRのサービス画面に接続し、プライベートリポジトリを作成します。検証のテストのため、基本的にデフォルト値で大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/00173d05-4630-2177-3ebf-b39cb5186215.png)

## Cloud9構築
　今回は、イメージ作成のためにCloud9を利用します。目的はECRにイメージを作ることなので、Cloud9を使わずにイメージを作成しても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/4d31d6d2-cd63-4a7f-c3a8-82b01b012cc2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/afb45cf1-905e-ea49-8cbb-72026323a0f2.png)

## Cloud9からイメージをプッシュ
　Cloud9の環境に接続して下記ファイルを作成します。
* app.js
```
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
  res.send('Hello, AWS App Runner! Qiita Test');
});

app.listen(port, () => {
  console.log(`App running on port ${port}`);
});
```

* package.json
```
{
  "name": "aws-app-runner-demo",
  "version": "1.0.0",
  "description": "A simple Node.js app for AWS App Runner",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "^4.17.1"
  },
  "engines": {
    "node": ">=14.0.0"
  }
}
```

* Dockerfile
```
# Use the official Node.js image from the Docker Hub
FROM node:14

# Create and change to the app directory
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy local code to the container image.
COPY . .

# Run the web service on container startup.
CMD [ "npm", "start" ]

# Expose the port the app runs on
EXPOSE 3000
```

　各ファイルの作成後、Cloud9のターミナルで以下コマンドを実行します。コマンドは作成したECRの「プッシュコマンドを表示」から確認することもできます。

```
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [AWSのアカウント番号].dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t [ECRのリポジトリ名] .
$ docker tag qiita_test:latest [ECRのURI]:latest
$ docker push [ECRのURI]:latest
```
　コマンド実施後、ECRにイメージがあることを確認しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/d6debc04-301d-875b-880b-c3d5f93d4f18.png)

## App Runner構築
　先ほど作成したECRを選択します。ソースコードリポジトリとしてGitHubを選択することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/2c7f64ea-76a2-c3e3-c7d5-79d0f3fad9bd.png)

　App Runnerで構築されるコンテナの詳細を設定します。作成したコードに合わせて「ポート」は「3000」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/346460ef-20ec-d7f9-26e6-f96da4d1142c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/24684b54-b931-3d92-a1a3-a5cdffee18bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/2f4e3ca4-353e-32df-b6cd-b219c85156a4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/54cd6e6f-235a-1f92-f604-3eee80f7c74f.png)

　最後に設定した内容を確認し、問題なければ、「作成とデプロイ」をクリックします。下記は正常にデプロイされたApp Runnerの画面です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/52d8df3c-6834-0746-92c3-6bffe9ff6dd3.png)

　作成された「デフォルトドメイン」にGoogleChromeやEdgeなどブラウザで接続します。下記画面が表示されたら成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/4aaaeacc-d6ba-54e9-724d-0f4409eb00e5.png)

# 最後に
　いかがでしたでしょうか。VPCなどインフラ周りの構築なしでここまで構築できるのは、非常にラクですね！色々触ってみると、カスタムVPCにApp Runnerをデプロイしたり、WAFを関連付けできるなど、色々と機能がありそうです。その他の機能については、また別のタイミングで紹介できればと思います。