copilot version: v1.20.0
を使用しています。
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 -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
が作成されます# 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
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/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 --name sample-app-runner --env stage
...
...
※ 前述しましたが、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/