#
ドキュメント

Document

自分のための備忘録です。

CopilotでApp Runnerサービスを作成

copilot version: v1.20.0を使用しています。

ゴール

ALB internal (1)

10.1.0.0/16にVPC コネクタで接続したApp Runerから10.0.0.0/16に配置されたInternal Albにアクセスします。
App Runerからインターネットへのアクセスも可能にします。

VPC に接続すると、AppRunner サービスからすべてのアウトバウンドトラフィックが VPC ルーティングルールに基づいてルーティングされます。NAT ゲートウェイへのルートで許可されない限り、サービスはパブリックインターネット (AWS API を含む) にアクセスできません。また、Amazon Simple Storage Service (Amazon S3)や Amazon DynamoDB などの AWS API に接続するように VPC エンドポイントを設定して、NAT トラフィックを回避することもできます。

-- https://aws.amazon.com/jp/blogs/news/new-for-app-runner-vpc-support/

準備

最新バージョンにアップデートします(2022年08月14日の最新はv1.20.0)。

$ curl -Lo copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-darwin && chmod u+x copilot && sudo mv copilot /usr/local/bin/copilot && copilot --help

アプリケーションを作成

$ copilot app init
Use existing application: No
Application name: sample-app-runner
✔ Created the infrastructure to manage services and jobs under application sample-app-runner..

✔ The directory copilot will hold service manifests for application sample-app-runner.

Recommended follow-up action:
    Run `copilot init` to add a new service or job to your application.

プロジェクトにcopilot/.workspaceが作成されます。

application: sample-app-runner
path: ""

環境を作成

10.1.0.0/16に2つのパブリックサブネットと2つのプライベートサブネットを作成します。

copilot env init

$ copilot env init -n stage -a sample-app-runner \
--override-vpc-cidr      10.1.0.0/16 \
--override-private-cidrs 10.1.2.0/24,10.1.3.0/24 \
--override-public-cidrs  10.1.0.0/24,10.1.1.0/2

CIDRは例では10.1.0.0/16とします。

  • プロジェクトにcopilot/environments/stage/manifest.ymlが作成されます
  • AWSにIAMロールが作成されます

manifest.yml

# The manifest for the "stage" environment.
# Read the full specification for the "Environment" type at:
#  https://aws.github.io/copilot-cli/docs/manifest/environment/

# Your environment name will be used in naming your resources like VPC, cluster, etc.
name: stage
type: Environment

# Import your own VPC and subnets or configure how they should be created.
network:
  vpc:
    cidr: 10.1.0.0/16
    subnets:
      public:
        - cidr: 10.1.0.0/24
          az: ap-northeast-1a
        - cidr: 10.1.1.0/24
          az: ap-northeast-1c
      private:
        - cidr: 10.1.2.0/24
          az: ap-northeast-1a
        - cidr: 10.1.3.0/24
          az: ap-northeast-1c

# Configure the load balancers in your environment, once created.
# http:
#   public:
#   private:

# Configure observability for your environment resources.
observability:
  container_insights: false

IAMロール

  • http-client-adminrole
  • http-client-executionrole
  • http-client-stage-CFNExecutionRole
  • http-client-stage-EnvManagerRole

copilot env deploy

copilot/environments/stage/manifest.ymlの内容をデプロイします。

copilot env deploy --name stage
✔ Proposing infrastructure changes for the sample-app-runner-stage environment.
- Creating the infrastructure for the sample-app-runner-stage environment.          [update complete]  [80.8s]
  - An ECS cluster to group your services                                     [create complete]  [9.5s]
  - A security group to allow your containers to talk to each other           [create complete]  [5.9s]
  - An Internet Gateway to connect to the public internet                     [create complete]  [17.3s]
  - Private subnet 1 for resources with no internet access                    [create complete]  [5.9s]
  - Private subnet 2 for resources with no internet access                    [create complete]  [5.9s]
  - A custom route table that directs network traffic for the public subnets  [create complete]  [15.7s]
  - Public subnet 1 for resources that can access the internet                [create complete]  [5.9s]
  - Public subnet 2 for resources that can access the internet                [create complete]  [5.9s]
  - A private DNS namespace for discovering services within the environment   [create complete]  [46.8s]
  - A Virtual Private Cloud to control networking of your AWS resources       [create complete]  [14.1s]

サービスを作成

copilot svc init

$ copilot svc init
...
...

copilot/sample-app-runner/manifest.ymlが作成されます。

 The manifest for the "sample-app-runner" service.
# Read the full specification for the "Request-Driven Web Service" type at:
# https://aws.github.io/copilot-cli/docs/manifest/rd-web-service/

# Your service name will be used in naming your resources like log groups, App Runner services, etc.
name: sample-app-runner
# The "architecture" of the service you're running.
type: Request-Driven Web Service

image:
  # Docker build arguments.
  # For additional overrides: https://aws.github.io/copilot-cli/docs/manifest/rd-web-service/#image-build
  build: 
    dockerfile: .docker/app/Dockerfile
    context: .
  # Port exposed through your container to route traffic to it.
  port: 80

# http:
#   healthcheck:
#     path: /
#     healthy_threshold: 3
#     unhealthy_threshold: 5
#     interval: 10s
#     timeout: 5s

# Number of CPU units for the task.
cpu: 1024
# Amount of memory in MiB used by the task.
memory: 2048

# # Connect your App Runner service to your environment's VPC.
# network:
#    vpc:
#      placement: private

# Enable tracing for the service.
# observability:
#   tracing: awsxray

# Optional fields for more advanced use-cases.
#
# variables:                    # Pass environment variables as key value pairs.
#   LOG_LEVEL: info
#
tags:                         # Pass tags as key value pairs.
  project: sample-app-runner

# You can override any of the values defined above by environment.
# environments:
#   test:
#     variables:
#       LOG_LEVEL: debug        # Log level for the "test" environment.

copilot svc deploy

$ copilot svc deploy --name sample-app-runner --env stage
...
...
  • App Runnerがプライベートサブネットに
  • App Runnerにstage環境へのVPC コネクトが作成
  • パブリックサブネットにNATゲートウェイが作成
  • プライベートサブネット用のルートテーブルにNATゲートウェイのルートを作成(これでApp RunnerはInternetに接続できる)

VPC コネクタ

  • App Runnerを作成する
  • App Runnerとstage環境を接続するVPC コネクトを作成する
  • VPC コネクト先はすべてのプライベートサブネットになる
  • NATゲートウェイが作成される(プライベートサブネットの数だけ作成される)
  • パブリックサブネットにNATゲートウェイが配置される
  • プライベートサブネットのルートテーブルにNATゲートウェイのルートが追加される(これでApp RunnerはInternetに接続できる)

VPC Peeringを設定

  • VPC Peeringを設定します
  • stage環境のプライベートサブネットのルートテーブルにVPC Peering用のルートを追加します

プライベートサブネットのルートテーブル

VPC_Management_Console

※ 前述しましたが、NATゲートウェイのルートが必要な理由は以下のためです。
VPC コネクトのコネクト先サブネットがパブリックネットワークの場合、NATゲートウェイを使用できないのでApp Runnerからのアウトバウンドトラフィックはインターネットにアクセスできません。

VPC に接続すると、AppRunner サービスからすべてのアウトバウンドトラフィックが VPC ルーティングルールに基づいてルーティングされます。NAT ゲートウェイへのルートで許可されない限り、サービスはパブリックインターネット (AWS API を含む) にアクセスできません。また、Amazon Simple Storage Service (Amazon S3)や Amazon DynamoDB などの AWS API に接続するように VPC エンドポイントを設定して、NAT トラフィックを回避することもできます。
-- https://aws.amazon.com/jp/blogs/news/new-for-app-runner-vpc-support/