Amazon Web Services ブログ

App Runner の新機能 — Amazon Virtual Private Cloud (VPC) をサポート

AWS App Runner を使用すると、ウェブアプリケーションと API をあらゆるスケールですばやくデプロイできます。ソースコードまたはコンテナイメージから始めることができ、App Runner はアプリケーションのサーバー、ネットワーク、ロードバランシングを含むすべてのインフラストラクチャをすべて管理します。必要に応じ、App Runner でデプロイパイプラインを設定することもできます。

2022 年 2 月 8 日(米国時間)より App Runner では、Amazon Virtual Private Cloud (VPC) でホストされているデータベースやその他のアプリケーションとサービスが通信できるようになります。たとえば、App Runner サービスを Amazon リレーショナルデータベースサービス (RDS) のデータベース、Amazon ElastiCache の Redis または Memcached キャッシュ、または Amazon Elastic Container Service (Amazon ECS) で実行されている独自のアプリケーションに接続できるようになり、Amazon Elastic Kubernetes Service (EKS)Amazon Elastic Compute Cloud (Amazon EC2)、またはオンプレミスの AWS Direct Connect 経由で接続できます。

以前は、App Runner アプリケーションがこれらのリソースに接続するには、インターネット経由でパブリックアクセスされている必要がありました。この機能により、App Runner アプリケーションは VPC 内のプライベートエンドポイントに接続でき、これらのリソースへのパブリックアクセスを削除することで、より安全でコンプライアンスに準拠した環境を実現できます。

App Runner 内で、プライベートネットワークに使用する VPC、サブネット、セキュリティグループを指定する VPC コネクタを作成できるようになりました。設定が完了すると、VPC コネクタを 1 つ以上の App Runner サービスで使用できます。

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

App Runner の VPC コネクタは、AWS LambdaVPC ネットワークと同様に機能し、AWS のサービスとリソースを支える Amazon 内部のネットワーク機能仮想化システムである AWS Hyperplane と、Network Load BalancerNAT ゲートウェイAWS PrivateLink などをベースにしています。

RDS データベースに接続されたウェブアプリケーションで、実際これがどのように機能するかを見てみましょう。

Amazon RDS データベースの準備
まず、アプリケーション用にデータベースを設定します。このデータベースの容量管理を簡素化するために、Amazon Aurora Serverless を使用しています。RDS コンソールで、Amazon Aurora MySQL 互換データベースを作成します。キャパシティタイプは [サーバーレス] を選択します。ネットワークには、デフォルト VPCデフォルトのセキュリティグループを使用します。 プライベート VPC ネットワークを使用して接続するため、データベースをパブリックにアクセスできるようにする必要はありません。後で簡単に接続できるように、AWS Identity and Access Management (IAM) データベース認証を有効にします。

同じ VPC 内で Amazon Linux EC2 インスタンスを起動します。EC2 インスタンスからデータベースに接続するには、MySQL クライアントが必要です。MySQL のコミュニティ開発ブランチである MariaDB をインストールします。

sudo yum install mariadb

次に、管理者ユーザーを使用してデータベースに接続します。

mysql -h <DATABASE_HOST> -u admin -P

管理者ユーザーのパスワードを入力してログインします。次に、IAM 認証を使用するように設定された新しいユーザー (bookuser) を作成します。

CREATE USER bookuser IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS'; 

bookcase データベースを作成し、bookuserbookcase データベースにクエリを実行する権限を付与します。

CREATE DATABASE bookcase;
GRANT SELECT ON bookcase.* TO 'bookuser'@'%’;

一部の books についての情報を保存するために、authors テーブルと books テーブルを作成します。

CREATE TABLE authors (
  authorId INT,
  name varchar(255)
 );

CREATE TABLE books (
  bookId INT,
  authorId INT,
  title varchar(255),
  year INT
);

次に、2 つのテーブルにいくつかの値を挿入します。

INSERT INTO authors VALUES (1, "Issac Asimov");
INSERT INTO authors VALUES (2, "Robert A. Heinlein");
INSERT INTO books VALUES (1, 1, "Foundation", 1951);
INSERT INTO books VALUES (2, 1, "Foundation and Empire", 1952);
INSERT INTO books VALUES (3, 1, "Second Foundation", 1953);
INSERT INTO books VALUES (4, 2, "Stranger in a Strange Land", 1961);

アプリケーションソースコードリポジトリの準備
App Runner では、ソースコードリポジトリでホストされているコードから、またはコンテナイメージを使用して新しいサービスをデプロイできます。この例では、GitHub にあるプライベートプロジェクトを使用しています。

これは、先ほど作成したデータベースに接続するとてもシンプルな Python ウェブアプリケーションです。これはアプリのソースコード (server.py) です。

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
import os
import boto3
import mysql.connector

import os

DATABASE_REGION = 'us-east-1'
DATABASE_CERT = 'cert/us-east-1-bundle.pem'
DATABASE_HOST = os.environ['DATABASE_HOST']
DATABASE_PORT = os.environ['DATABASE_PORT']
DATABASE_USER = os.environ['DATABASE_USER']
DATABASE_NAME = os.environ['DATABASE_NAME']

os.environ['LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN'] = '1'

PORT = int(os.environ.get('PORT'))

rds = boto3.client('rds')

try:
    token = rds.generate_db_auth_token(
        DBHostname=DATABASE_HOST,
        Port=DATABASE_PORT,
        DBUsername=DATABASE_USER,
        Region=DATABASE_REGION
    )
    mydb =  mysql.connector.connect(
        host=DATABASE_HOST,
        user=DATABASE_USER,
        passwd=token,
        port=DATABASE_PORT,
        database=DATABASE_NAME,
        ssl_ca=DATABASE_CERT
    )
except Exception as e:
    print('Database connection failed due to {}'.format(e))          

def all_books(request):
    mycursor = mydb.cursor()
    mycursor.execute('SELECT name, title, year FROM authors, books WHERE authors.authorId = books.authorId ORDER BY year')
    title = 'Books'
    message = '<html><head><title>' + title + '</title></head><body>'
    message += '<h1>' + title + '</h1>'
    message += '<ul>'
    for (name, title, year) in mycursor:
        message += '<li>' + name + ' - ' + title + ' (' + str(year) + ')</li>'
    message += '</ul>'
    message += '</body></html>'
    return Response(message)

if __name__ == '__main__':

    with Configurator() as config:
        config.add_route('all_books', '/')
        config.add_view(all_books, route_name='all_books')
        app = config.make_wsgi_app()
    server = make_server('0.0.0.0', PORT, app)
    server.serve_forever()

このアプリケーションは、IAM データベース認証に AWS SDK for Python (boto3)Pyramid ウェブフレームワークPython 用 MySQL コネクタを使用します。requirements.txt ファイルには、アプリケーションの依存関係が記述されています。

boto3
pyramid==2.0
mysql-connector-python

データベースへの接続時に SSL/TLS 暗号化を使用するには、証明書バンドルをダウンロードしてソースコードリポジトリに追加します。

AWS App Runner で VPC サポートを使用する
App Runner コンソールで、[ソースコードリポジトリ] と [使用するブランチ] を選択します。

コンソールのスクリーンショット。

デプロイの設定には、[手動] を選択します。必要に応じて、[自動] のデプロイトリガーを選択して、このブランチへプッシュするたびに新しいバージョンのサービスをデプロイすることもできます。

コンソールのスクリーンショット。

次に、ビルドを設定します。これは非常に単純なアプリケーションのため、ビルドコマンドとスタートコマンドをコンソールに渡します。

Build commandpip install -r requirements.txt
Start commandpython server.py

より高度なユースケースでは、このサンプルアプリケーション のように apprunner.yaml 設定ファイルをリポジトリに追加します。

コンソールのスクリーンショット。

サービス設定では、アプリケーションがデータベースに接続するために使用する環境変数を追加します。IAM 認証を使用しているため、ここでデータベースパスワードを渡す必要はありません。

コンソールのスクリーンショット。

[セキュリティ] セクションで、IAM データベースアクセスのための IAM ポリシー作成と使用の説明に従って、IAM データベース認証を使用してデータベースに接続するためのアクセス権限を付与する IAM ロールを選択します。

コンソールのスクリーンショット。

IAM ロールの構文は次のとおりです。データベースのリソース ID は、RDS コンソールの [設定] タブにあります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds-db:connect"
            ],
            "Resource": [
                "arn:aws:rds-db:<REGION>:<ACCOUNT>:dbuser:<DB_RESOURCE_ID>/<DB_USER>"
            ]
        }
    ]
}

ロールの信頼ポリシーについては、App Runner と IAM の連携方法のインスタンスロールの手順に従います。

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

ネットワークで、送信ネットワークトラフィックにカスタム VPC を使用する新しいオプションを選択し、新しい VPC コネクタを追加します。

コンソールのスクリーンショット。

新しい VPC コネクタを追加するには、名前を書き留めてから、使用する VPC、サブネット、セキュリティグループを選択します。ここでは、デフォルトの VPC とデフォルトのセキュリティグループすべてのサブネットを選択します。これにより、App Runner サービスが RDS データベースに接続できるようになります。

コンソールのスクリーンショット。

次回、同じ VPC ネットワーク要件を持つ別のアプリケーションを設定するときに、前に作成した VPC コネクタを選択するだけです。

コンソールのスクリーンショット。すべての設定を確認し、サービスを作成してデプロイします。

数分後、サービスが実行され、デフォルトのドメインを選択してブラウザで新しいタブを開きます。アプリケーションは VPC ネットワークを使用してデータベースに接続され、SQL クエリを実行して books テーブルと authors テーブルを結合し読み方を提案します。上手く行きました!

ブラウザのスクリーンショット。

利用可能なリージョンと料金
VPC コネクタは、AWS App Runner が提供されているすべての AWS リージョンで利用できます。詳細については、リージョン別のサービス表をご覧ください。この機能を使用しても追加料金は発生しませんが、データ転送、または設定した NAT ゲートウェイまたは VPC エンドポイントについては、標準コストをお支払いいただきます。VPC コネクタは、AWS マネジメントコンソールAWS コマンドラインインターフェイス (CLI)AWS SDK、および AWS CloudFormation を使用してセットアップできます。

VPC コネクタを使用すると、App Runner を使ってアプリケーションをデプロイし、VPC またはオンプレミスで実行され、AWS Direct Connect 経由で接続されたプライベートデータベース、キャッシュ、アプリケーションに接続できます。

AWS App Runner を使用して、あらゆるスケールでウェブアプリケーションを構築して実行し、プライベート VPC リソースに接続します。

Danilo

原文はこちらです。