AppConfigのPrivateLinkを活用して、セキュアなアプリケーション設定を実現する方法

急遽帰省することになり、AWS Summit Japan 2024には関東に戻れるといいなと思っております。 AWS AppConfigがAWS PrivateLinkをサポートし始めたのが2023年12月のことで、まだ記憶に新しい出来事です。

aws.amazon.com

本ブログ投稿では、ECS on Fargateを例として、AppConfigのPrivateLinkサポートを活用した具体的な設定方法と注意点をご紹介します。

読者の前提条件

  • ✅ AWS AppConfig、VPCエンドポイント、Amazon ECSを概要レベルで理解している必要があります。

AWS AppConfigのAWS PrivateLinkサポートで何が変わるのか

これまでは、プライベートサブネットからAWS AppConfigを利用するためには、NATゲートウェイが必要でした。

NATゲートウェイを利用したAWS構成図

AppConfigがPrivateLinkに対応したことで、AppConfigへのアクセスをVPC Interface Endpointを経由して行えるようになり、NATゲートウェイが不要になりました。

VPC エンドポイントを利用したAWS構成図

AppConfigのPrivateLinkの利用方法

ここからは、Amazon ECSの例を用いて、AppConfigのPrivateLinkを利用する方法をご紹介します。

1. NAT Gatewayを利用しない状態での確認

まず、NATゲートウェイを利用せずにプライベートサブネットに配置されたECSタスクのAppConfigサイドカーコンテナでエラーが発生することを確認します。以下のCloudWatchLogsの内容から、タイムアウトエラーが発生していることがわかります。

タイムアウトエラーのログ情報

2. AppConfigのVPCエンドポイントを追加する。

タイムアウトエラーを解消するために、AppConfigのVPCエンドポイントを追加します。AppConfigは2種類のエンドポイントがあり、「com.amazonaws.region.appconfig」と「com.amazonaws.region.appconfigdata」の両方のVPC Interface Endpointを設定してあげる必要があります。

VPC Interface Endpointの設定は、他のサービスと同様に、HTTPS(ポート443)に対するインバウンドを許可するセキュリティグループと、プライベートサブネットの指定が必要です。

VPC Interface Endpointの設定例

3. AppConfigに接続して動作確認する

Web APIのエンドポイントをブラウザから呼び出して、AppConfigから設定内容を取得する動作を確認します。以下の画像のように、レスポンスにはconfig情報を含むJSONが返され、AppConfigから設定内容を適切に取得できていることが確認できます。

Web APIのレスポンス内容

4. AppConfigの機能フラグを切り替えて動作確認する

次に、AppConfigの設定を更新しても正しく動作するか確認します。ここでは機能フラグを切り替えます。以下の画像のように、フラグをオンに変更してデプロイします。

機能フラグの設定変更

デプロイ後にもう一度Web APIのエンドポイントをブラウザから呼び出すと、config情報のJSONの値が変更されていることがわかります。機能フラグの切り替えが適切に反映されていました。

機能フラグ切り替え後のWeb APIレスポンス確認

注意点:AppConfigエージェントのコンテナイメージの取得について

AppConfigエージェントのコンテナイメージはECR Publicで公開されています。プライベートサブネットでNATゲートウェイを利用しない環境では、ECR Publicに接続できなくなります。その結果、コンテナイメージを取得できず、ECSサービスが起動できません。この問題を解決するための有効な方法として、Pull through cacheの設定を行うことができます。

Pull through cacheを利用したAppConfigエージェントのコンテナイメージの取得方法

次に、Pull through cacheを利用したAppConfigエージェントのコンテナイメージの取得方法を解説します。 まず、以下の画像のように、Pull through cacheを設定します。

Pull through cacheの設定

次にAWS CLIを利用してECRにログインします。

# ログインコマンド例
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public

ECR Publicにあるコンテナイメージを取得するには、ecr-publicのnamespaceを指定する必要があります。

# ECR Publicからコンテナイメージpullの例
$ docker image pull xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/aws-appconfig/aws-appconfig-agent:2.x

すると、自動的にプライベートリポジトリにPull through cacheとして保存されます。

保存されたPull through cache

あとは、ECSのタスク定義に、キャッシュされたコンテナイメージのURIを指定するだけでOKです。

ECSタスク定義にPull through cacheで取得したコンテナイメージを指定

サンプルのGitHubリポジトリ

こちらで紹介した方法で利用したソースコードは、以下のGitHubリポジトリにありますので、ご活用ください。

github.com

おわりに

AppConfigのPrivateLinkを活用して、セキュアなアプリケーション設定を実現する方法をご紹介しました。今回はECSの事例でしたが、機会があればVPC Lambdaにおけるプライベートサブネットでの利用例も紹介できればと考えています。AppConfigは漸進的なアプリケーション構築に必須であり、積極的に活用していきたいと考えております。参考になれば幸いです。