# AWS Copilot ã«ã‚ˆã‚‹ AWS App Runner ã® VPC 接続 投稿日: 2022 å¹´ 6 月 15 æ—¥ **Rafael Mosca**, Associate Solutions Architect, WWPS EMEA Central SA [AWS Copilot CLI](https://aws.github.io/copilot-cli/ja/) 㯠[2020 å¹´ã«ãƒãƒ¼ãƒ³ãƒ](https://aws.amazon.com/jp/blogs/containers/introducing-aws-copilot/)ã•れãŸãƒ„ールã§ã€ãれ以æ¥ã€é–‹ç™ºè€…㯠[Amazon Elastic Container Service (Amazon ECS)](https://aws.amazon.com/jp/ecs/)ã€[AWS Fargate](https://aws.amazon.com/jp/fargate/)ã€[AWS App Runner](https://aws.amazon.com/jp/apprunner/) 上㧠Linux ã‚„ Windows コンテナをビルドã€ç®¡ç†ã€é‹ç”¨ã™ã‚‹ãŸã‚ã«åˆ©ç”¨ã•れã¦ã„ã¾ã™ã€‚ 2022 å¹´ 2 月ã€AWS 㯠[AWS App Runner ã® VPC サãƒãƒ¼ãƒˆ](https://aws.amazon.com/jp/blogs/aws/new-for-app-runner-vpc-support/)を発表ã—ã¾ã—ãŸã€‚ã“れã«ã‚ˆã‚Šã€[AWS App Runner](https://aws.amazon.com/jp/apprunner/) を利用ã—ã¦ãƒ‡ãƒ—ãƒã‚¤ã™ã‚‹ Web アプリケーションや API ã¯ã€[Amazon Relational Database Service (RDS)](https://aws.amazon.com/jp/rds/) ãªã©ã®ã‚µãƒ¼ãƒ“スã§å‹•作ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚„ã€[Amazon Virtual Private Cloud (Amazon VPC)](https://aws.amazon.com/jp/vpc/) ã§ãƒ›ã‚¹ãƒˆã•れã¦ã„ã‚‹ [Amazon Elastic Container Service (Amazon ECS)](https://aws.amazon.com/jp/ecs/)ã€[Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/jp/eks/)ã€[Amazon Elastic Compute Cloud (Amazon EC2)](https://aws.amazon.com/jp/ec2/) ã§å‹•作ã™ã‚‹ã€ä»–ã®ã‚¢ãƒ—リケーションã¨é€šä¿¡ã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ AWS App Runner ã®ç®¡ç†ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«ã¦[ドã‚ュメントã«è¨˜è¼‰ã•れã¦ã„ã‚‹æ‰‹é †](https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/network-vpc.html)ã«å¾“ã£ã¦ VPC アクセスを有効化ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ã“ã®æ‰‹é †æ›¸ã§ã¯ã€AWS Copilot を使用ã—㦠VPC アクセスを有効化ã—㦠[Amazon Aurora](https://aws.amazon.com/jp/rds/aurora/) ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ç°¡å˜ãªæ–¹æ³•を説明ã—ã¾ã™ã€‚ ## 背景 [AWS App Runner](https://aws.amazon.com/jp/apprunner/) ã¯ã€é–‹ç™ºè€…㌠Web サーãƒãƒ¼ã‚„ API サーãƒãƒ¼ãªã©ã® HTTP ベースã®ã‚¢ãƒ—リケーションを簡å˜ã«å®Ÿè¡Œã§ãるよã†ã«è¨è¨ˆã•れãŸãƒ•ルマãƒãƒ¼ã‚¸ãƒ‰ã‚µãƒ¼ãƒ“スã§ã™ã€‚事å‰ã®ã‚¤ãƒ³ãƒ•ラや経験ã¯å¿…è¦ã‚りã¾ã›ã‚“。ソースコードやコンテナイメージを与ãˆã‚‹ã¨ã€App Runner ãŒã‚¢ãƒ—リケーションコンテナをビルドã—㦠AWS クラウドã«ãƒ‡ãƒ—ãƒã‚¤ã—ã€ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’自動的ã«ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã—ã¦ãƒãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚·ãƒ³ã‚°ã‚’行ã„ã¾ã™ã€‚表示ã•れるã®ã¯ã€HTTPS リクエストを実行ã§ãã‚‹ App Runner サービス㮠URL ã ã‘ã§ã™ã€‚  サービスを作æˆã™ã‚‹ã¨ã€è£ã§ã¯ App Runner ãŒæ‰€å±žã™ã‚‹ VPC ã§ [Amazon Elastic Container Service (ECS)](https://aws.amazon.com/jp/ecs/) ã«ã‚ˆã£ã¦ã‚ªãƒ¼ã‚±ã‚¹ãƒˆãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã•れ㟠[AWS Fargate](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/what-is-fargate.html) タスクã¨ã—ã¦ã‚¢ãƒ—リケーションコンテナãŒãƒ‡ãƒ—ãƒã‚¤ã•れã¾ã™ã€‚デフォルトã§ã¯ã€ã‚¢ãƒ—リケーションã«ã‚ˆã£ã¦é–‹å§‹ã•れãŸã™ã¹ã¦ã®ã‚¢ã‚¦ãƒˆãƒã‚¦ãƒ³ãƒ‰ãƒˆãƒ©ãƒ•ィックã¯ã€NAT ゲートウェイã¨ã“ã® App Runner ãŒæ‰€æœ‰ã™ã‚‹ VPC ã«ãƒ—ãƒãƒ“ジョニングã•れãŸã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã‚²ãƒ¼ãƒˆã‚¦ã‚§ã‚¤ã‚’経由ã—ã¦ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«ãƒ«ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã•れã¾ã™ã€‚従ã£ã¦ã“ã®ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã€App Runner ã§ãƒ›ã‚¹ãƒˆã•れã¦ã„るアプリケーションã¯ã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆä¸Šã®ãƒ‘ブリックエンドãƒã‚¤ãƒ³ãƒˆã«ã®ã¿æŽ¥ç¶šã§ãã¾ã™ãŒã€VPC 内ã®ãƒ—ライベートエンドãƒã‚¤ãƒ³ãƒˆã«åˆ°é”ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。  [App Runner サービス ã® VPC サãƒãƒ¼ãƒˆã®ç™ºè¡¨](https://aws.amazon.com/jp/about-aws/whats-new/2022/02/aws-app-runner-amazon-vpc/)ã«ã‚ˆã‚Šã€ã‚¢ãƒ—リケーション㯠Amazon RDS データベースや Amazon ElastiCache クラスタãªã©ã€VPC 内ã§ãƒ›ã‚¹ãƒˆã•れã¦ã„ã‚‹ãƒ—ãƒ©ã‚¤ãƒ™ãƒ¼ãƒˆãƒªã‚½ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãるよã†ã«ãªã‚Šã¾ã—ãŸã€‚ VPC ã®å†…部ã§ä½•ãŒèµ·ã“ã£ã¦ã„ã‚‹ã‹ã‚’ç†è§£ã™ã‚‹ã«ã¯ã€[AWS App Runner ã® VPC ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚ングã«é–¢ã—㦠Dive Deep ã—ãŸè¨˜äº‹ã‚’ãƒã‚§ãƒƒã‚¯](https://aws.amazon.com/jp/blogs/containers/deep-dive-on-aws-app-runner-vpc-networking/)ã—ã¦ãã ã•ã„。è¦ç´„ã™ã‚‹ã¨ã€VPC コãƒã‚¯ã‚¿ã‚’作æˆã™ã‚‹ã“ã¨ã§ã€App Runner サービスã¯ã€ã‚¢ã‚¦ãƒˆãƒã‚¦ãƒ³ãƒ‰ãƒˆãƒ©ãƒ•ィックã®ã¿ã«ä½¿ç”¨ã§ãる一方å‘ã® Elastic Network Interface (ENI) を所有ã—ã¦ã„ã‚‹ VPC 上ã«ä½œæˆã—ã¾ã™ã€‚(ã¤ã¾ã‚Šã€ENI ã® IP アドレスã«ã‚¤ãƒ³ãƒã‚¦ãƒ³ãƒ‰ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。) ã“ã® ENI ã«ã¯ã€ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã—ãŸã‚¢ã‚¦ãƒˆãƒã‚¦ãƒ³ãƒ‰ãƒ«ãƒ¼ãƒ«ã‚’å«ã‚€ã‚ˆã†ã«å¤‰æ›´ã§ãã‚‹ã‚»ã‚ュリティグループãŒã‚りã€å¸Œæœ›ã™ã‚‹å®›å…ˆã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã¸ã®é€šä¿¡ã‚’許å¯ã—ã¾ã™ã€‚ ## アーã‚テクãƒãƒ£ä¾‹ AWS Copilot CLI 㨠AWS App Runner ã® VPC サãƒãƒ¼ãƒˆã®æ©Ÿèƒ½ã‚’実証ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®å›³ã®ã‚ˆã†ãªã‚¢ãƒ¼ã‚テクãƒãƒ£ã‚’実装ã™ã‚‹æ–¹æ³•ã‚’ã”紹介ã—ã¾ã™ã€‚  å¿…è¦ãªã‚¹ãƒ†ãƒƒãƒ—ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ - Copilot ã® Environment 概念を使用ã—ã¦ã€Customer VPC を作æˆã—ã¾ã™ã€‚ - ã“ã® VPC 内ã®ãƒ—ライベートサブãƒãƒƒãƒˆå†…ã« [Amazon Aurora](https://aws.amazon.com/jp/rds/aurora/) PostgreSQL データベースを作æˆã—ã¾ã™ã€‚ - AWS App Runner 上ã§å‹•作ã™ã‚‹ Service ã‚’ã€VPC 内ã«ã‚るデータベース㫠VPC コãƒã‚¯ã‚¿ãƒ¼ã‚’使用ã—ã¦æŽ¥ç¶šã—ã€é©åˆ‡ãªã‚»ã‚ュリティグループã®ãƒ«ãƒ¼ãƒ«ã‚’è¨å®šã—ã¾ã™ã€‚ - Python å‘ã‘ã®ä¸€èˆ¬çš„㪠ORM ã§ã‚ã‚‹ SQLAlchemy を使用ã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã€æŽ¥ç¶šãŒã†ã¾ãã„ãã“ã¨ã‚’確èªã—ã¾ã™ã€‚ ### 剿æ¡ä»¶ 上記ã®ã‚¢ãƒ¼ã‚テクãƒãƒ£ã‚’ビルドã™ã‚‹ãŸã‚ã«ã¯ã€ä»¥ä¸‹ã®å‰ææ¡ä»¶ãŒå¿…è¦ã§ã™ã€‚ - [AWS アカウント](https://aws.amazon.com/jp/premiumsupport/knowledge-center/create-and-activate-aws-account/)ã¨ã€ä¸Šè¨˜ã®ã‚¤ãƒ³ãƒ•ラストラクãƒãƒ£ã‚’デプãƒã‚¤ã™ã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ã„ã‚‹ã“ã¨ã€‚ - ãƒãƒ¼ã‚«ãƒ«ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã« [AWS Copilot CLI](https://aws.github.io/copilot-cli/ja/docs/getting-started/install/) ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã“ã¨ã€‚ - [AWS CLI](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) を使用ã—ã¦ã€ã¾ãŸã¯[環境変数](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html)を使用ã—ã¦ã€[AWS èªè¨¼æƒ…å ±](https://aws.github.io/copilot-cli/ja/docs/credentials/)ã‚’é©åˆ‡ã«æ§‹æˆã—ã¦ã„る。 - ãƒãƒ¼ã‚«ãƒ«ã®ãƒ¯ãƒ¼ã‚¯ã‚¹ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã« [Docker](https://www.docker.com/products/docker-desktop/) ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã€å®Ÿè¡Œã•れã¦ã„る。 - 次ã®ã‚µãƒ³ãƒ—ルリãƒã‚¸ãƒˆãƒªã‚’クãƒãƒ¼ãƒ³ã—ã¦ã„る。 - `git clone https://github.com/aws-rafams/apprunner-vpc-copilot` ### Application 㨠Environment ã®ä½œæˆ ã¾ãšã€é–¢é€£ã™ã‚‹ Serviceã€Environmentã€Pipeline ã®è«–ç†çš„ãªã‚°ãƒ«ãƒ¼ãƒ—を作æˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚AWS Copilot ã®ç”¨èªžã§ã¯ã€ã“れを _Application_ ã¨å‘¼ã³ã¾ã™ã€‚ `copilot app init apprunner-vpc` ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã¨ã€Copilot 㯠`./copilot` ã¨ã„ã†ãƒ•ォルダを使用ã—ã¦ã€_Manifest_ ã¨å‘¼ã°ã‚Œã‚‹ Infrastructure-as-Code ã®YAML è¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿æŒã™ã‚‹ã‚ˆã†ã«ãªã‚Šã€Copilot を使ã£ã¦ AWS 上ã«ã‚³ãƒ³ãƒ†ãƒŠåŒ–ã—㟠Application ã‚’ç°¡å˜ã«ãƒ‡ãƒ—ãƒã‚¤ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ 次ã®ã‚¹ãƒ†ãƒƒãƒ—ã¯ã€Service をデプãƒã‚¤ã™ã‚‹ Application ã® Environment を作æˆã™ã‚‹ã“ã¨ã§ã™ã€‚AWS Copilot ã§ã¯ã€ç•°ãªã‚‹ç’°å¢ƒã‚’作æˆã™ã‚‹ã“ã¨ã§ã€åˆ¥ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚„リージョンã«ã‚¢ãƒ—リケーションを論ç†çš„ã«åˆ†é›¢ã—ã¦ãƒ‡ãƒ—ãƒã‚¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚一般的ãªãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã¯ã€ãƒ†ã‚¹ãƒˆç’°å¢ƒã¨åˆ¥ã®æœ¬ç•ªç’°å¢ƒãŒã‚りã€ãƒ†ã‚¹ãƒˆç’°å¢ƒä¸Šã§æ¤œè¨¼ã•れãŸå ´åˆã«ã®ã¿ã‚¢ãƒ—リケーションãŒãƒ‡ãƒ—ãƒã‚¤ã•れるã€ã¨ã„ã†ã‚‚ã®ã§ã™ã€‚ã“ã®è¨˜äº‹ã®ç¯„囲ã§ã¯ã€æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã§ä½œæˆã—㟠_test_ ã¨ã„ã†åå‰ã®ãƒ†ã‚¹ãƒˆç’°å¢ƒã«ã®ã¿ Service をデプãƒã‚¤ã™ã‚‹ã“ã¨ã¨ã—ã¾ã™ã€‚ ``` copilot env init \ --app apprunner-vpc \ --name test \ --region 'eu-west-1' \ --default-config ``` コマンド㧠Enter を押ã™ã¨ã€Service をホストã™ã‚‹ãŸã‚ã«å¿…è¦ãªã‚¤ãƒ³ãƒ•ラストラクãƒãƒ£ã‚’作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れる AWS èªè¨¼æƒ…å ±ã‚’é¸æŠžã™ã‚‹ã‚ˆã†ã«æ±‚ã‚られã¾ã™ã€‚èªè¨¼æƒ…å ±ã‚’é¸æŠžã™ã‚‹ã¨ã€Copilot ãŒã‚ãªãŸã«ä»£ã‚ã£ã¦ãƒªã‚½ãƒ¼ã‚¹ã®ä½œæˆã‚’é–‹å§‹ã—ã¾ã™ã€‚ã“ã®ãƒ—ãƒã‚»ã‚¹ã«ã¯ã—ã°ã‚‰ã時間ãŒã‹ã‹ã‚‹ã®ã§ã€ã“ã®ãƒ—ãƒã‚»ã‚¹ãŒå®Œäº†ã™ã‚‹ã¾ã§ã®é–“ã€å°‘ã—ストレッãƒã—ã¦ãŠå¾…ã¡ãã ã•ã„。 作æˆã—㟠Environment ã”ã¨ã«ã€AWS Copilot ã¯å€‹åˆ¥ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¹ã‚¿ãƒƒã‚¯ (VPC) ã¨ã€ä»Šå›žã®ãƒ‡ãƒ¢ã§ã¯ä½¿ç”¨ã—ãªã„ ECS Cluster を作æˆã—ã¾ã™ã€‚  ### AWS App Runner 上ã§å‹•作ã™ã‚‹ Service ã®ä½œæˆ AWS Copilotã¯ã€æ§˜ã€…ãªã‚¿ã‚¤ãƒ—ã® Service をデプãƒã‚¤ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã‚‹ã€ã„ãã¤ã‹ã®æŠ½è±¡åŒ–ã•ã‚ŒãŸæ©Ÿèƒ½ã‚’æä¾›ã—ã¾ã™ã€‚ã“ã®è¨˜äº‹ã®ä¾‹ã§ã¯ã€[Request-Driven Web Service](https://aws.github.io/copilot-cli/ja/docs/manifest/rd-web-service/) ã¨ã„ㆠCopilot パターンを使用ã—ã¦ã„ã¾ã™ã€‚ã“れã¯ã€å—信トラフィックã«åŸºã¥ã„ã¦ã‚ªãƒ¼ãƒˆã‚¹ã‚±ãƒ¼ãƒ«ã—ã€ãƒˆãƒ©ãƒ•ィックãŒãªã„ã¨ãã¯ãƒ™ãƒ¼ã‚¹ãƒ©ã‚¤ãƒ³ã¾ã§ã‚¹ã‚±ãƒ¼ãƒ«ãƒ€ã‚¦ãƒ³ã™ã‚‹ AWS App Runner サービスをデプãƒã‚¤ã—ã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã¯ã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆé‡ãŒæ€¥æ¿€ã«å¢—åŠ ã™ã‚‹ HTTP サービスやã€ãƒªã‚¯ã‚¨ã‚¹ãƒˆé‡ãŒå°‘ãªã„å ´åˆã«ã€ã‚ˆã‚Šè²»ç”¨å¯¾åŠ¹æžœãŒé«˜ããªã‚Šã¾ã™ã€‚ ``` copilot svc init \ --app apprunner-vpc \ --svc-type "Request-Driven Web Service" \ --name demo-service\ --port 5000 \ --dockerfile "demo-service/Dockerfile" ``` 通常ã€AWS Copilot 㯠`manifest.yml` ファイルを生æˆã—ã€å®Ÿéš›ã®ãƒ‡ãƒ—ãƒã‚¤ã«é€²ã‚€å‰ã«ãƒªã‚½ãƒ¼ã‚¹ã‚’ã•らã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚Application ã§ VPC アクセスを有効ã«ã™ã‚‹ã«ã¯ã€Manifest ファイル `copilot/demo-service/manifest.yml` ã‹ã‚‰æ¬¡ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’アンコメントã™ã‚‹ã ã‘ã§ã™ã€‚ ``` network: vpc: placement: private ``` ã“れらã®è¿½åŠ è¡Œã¯ã€ãƒ—ライベート VPC ãƒªã‚½ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ãŸã‚ã«å¿…è¦ãª VPC コãƒã‚¯ã‚¿ã‚’作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れã¾ã™ã€‚ ### VPC 上ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ VPC 内ã®ãƒ—ãƒ©ã‚¤ãƒ™ãƒ¼ãƒˆãƒªã‚½ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãã‚‹ã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã«ã€AWS Copilot を使用ã—㦠`demoDb` ã¨ã„ã†åå‰ã® Amazon Aurora Serverless v1 PostgreSQL データベースクラスタを作æˆã—ã¾ã™ã€‚ ``` copilot storage init \ --name demoDb \ --storage-type Aurora\ --workload demo-service \ --engine PostgreSQL\ --initial-db demo ``` ã“れã«ã‚ˆã‚Šã€AWS Copilot CLI を使用ã—ã¦ãƒ‡ãƒ—ãƒã‚¤ã•れる Amazon Aurora Serverless データベースã®è¨å®šã‚’å«ã‚€ `./copilot/demo-service/addons/demoDb.yml` ã¨ã„ã†ãƒ•ァイルãŒä½œæˆã•れã¾ã™ã€‚ Manifest ファイルを見るã¨ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯ãƒ‡ãƒ•ォルト㧠Copilot Application 㨠Environment ã® VPC ã«é–¢é€£ä»˜ã‘られãŸãƒ—ライベートサブãƒãƒƒãƒˆå†…ã«ä½œæˆã•れるã“ã¨ãŒã‚ã‹ã‚Šã¾ã™ã€‚ Copilot 㯠[AWS Secrets Manager](https://aws.amazon.com/jp/secrets-manager/) を使用ã—ã¦ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‘スワード㨠Service を生æˆã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。データベースパスワードã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€AWS Copilotã¯ã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆã®ARNを環境変数ã«ã‚¤ãƒ³ã‚¸ã‚§ã‚¯ãƒˆã—ã€å¾Œã§ SDK を使用ã—ã¦ãƒ‘スワードをå–å¾—ã§ãるよã†ã«ã—ã¾ã™ã€‚今回ã®ãƒ‡ãƒ¢ã§ã¯ Python を使用ã—ã¦ãŠã‚Š (ãªã®ã§ [boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) ãŒä½¿ç”¨ã•れã¦ã„ã¾ã™)ã€ã‚¤ãƒ³ã‚¸ã‚§ã‚¯ãƒˆã•れる環境変数㯠`DEMO_DB_SECRET_ARN` ã¨ã„ã†åå‰ã«ãªã‚Šã¾ã™ã€‚Python を使ã£ã¦ãƒ‘スワードをå–å¾—ã™ã‚‹ãŸã‚ã«ã¯ã€ä»¥ä¸‹ã®ã‚³ãƒ¼ãƒ‰ã‚’使用ã—ã¾ã™ã€‚ ``` sm_client = boto3.client('secretsmanager') secret_arn = os.getenv("DEMO_DB_SECRET_ARN") response = sm_client.get_secret_value(SecretId=secret_arn) secret = json.loads(response['SecretString']) ``` `secret` ã¯ä»¥ä¸‹ã®æƒ…å ±ã§ä½œã‚‰ã‚ŒãŸ Dictionary ã«ãªã‚Šã¾ã™ã€‚`{dbClusterIdentifier, password, dbname, engine, port, host, username}` ã§ä½œã‚‰ã‚ŒãŸ Dictionary ã§ã€ã“れを用ã„ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 今回ã¯ã€SQLAlchemy を利用ã—ã¾ã™ã€‚[SQLAlchemy](https://www.sqlalchemy.org/) 㯠Python ç”¨ã®æœ‰å㪠ORM (Object Relation Mapper) ツール ã§ã€ä½Žãƒ¬ãƒ™ãƒ«ã® SQL クエリã®ä»£ã‚りã«ã‚ªãƒ–ジェクト指å‘パラダイムを使ã£ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’照会・æ“作ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹ã«ã¯ã€[ドã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã§æŒ‡å®šã•れã¦ã„ã‚‹](https://flask-sqlalchemy.palletsprojects.com/en/2.x/config/#connection-uri-format)よã†ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šæ–‡å—列を作æˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã“ã®å ´åˆã€å¿…è¦ãªãƒ‘ラメータã¯ã™ã¹ã¦ `secret` Dictionary ã‹ã‚‰å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ``` DB_URI = f"postgresql://{secret['username']}:{secret['password']}@{secret['host']}/{secret['dbname']}" ``` Copilot ã¯è‡ªå‹•çš„ã«é©åˆ‡ãªã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãƒãƒ¼ãƒ«ã‚’作æˆã—ã€ä½œæˆã•れ㟠Secret ã«å¯¾ã—㦠`secretsmanager:GetSecretValue` アクションを許å¯ã—ã¾ã™ã€‚ã¾ãŸã€ã‚»ã‚ュリティグループもè¨å®šã™ã‚‹å¿…è¦ã¯ã‚りã¾ã›ã‚“。Copilot ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’è¿½åŠ ã—ãŸãŸã‚ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚»ã‚ュリティグループã¯ã€Service ã‚»ã‚ュリティグループ (VPCコãƒã‚¯ã‚¿ã«é–¢é€£ä»˜ã‘られãŸã‚‚ã®) ã‹ã‚‰ PostgreSQL ãƒãƒ¼ãƒˆ (5432) ã¸ã®ãƒˆãƒ©ãƒ•ィックを自動的ã«è¨±å¯ã—ã€Service ãŒã‚¢ã‚¦ãƒˆãƒã‚¦ãƒ³ãƒ‰ãƒˆãƒ©ãƒ•ィックをルーティングã™ã‚‹å ´æ‰€ã«ãªã‚Šã¾ã™ã€‚ ### サンプルアプリケーションã®ãƒ‡ãƒ—ãƒã‚¤ ã“ã‚Œã§æº–å‚™ãŒæ•´ã„ã¾ã—ãŸã®ã§ã€ã‚µãƒ³ãƒ—ルアプリケーションをデプãƒã‚¤ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ã‚µãƒ³ãƒ—ルアプリケーションã§ã¯ã€ãƒ—ãƒ©ã‚¤ãƒ™ãƒ¼ãƒˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æ–°ã—ã„ユーザーを挿入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ `copilot svc deploy --name demo-service --env test` Copilot ã¯ãƒãƒ¼ã‚«ãƒ«ã§å‹•作ã™ã‚‹ Docker Daemon を使ã£ã¦ã‚³ãƒ³ãƒ†ãƒŠã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ビルドã—ã€ECR ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã™ã‚‹ãŸã‚ã€Daemon ãŒèµ·å‹•ã—ã¦ã„ãªã„å ´åˆã¯ã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ“ルドã«å¤±æ•—ã—ã¦ã‚¨ãƒ©ãƒ¼ãŒãƒãƒƒãƒ—アップã•れã¾ã™ã€‚ イメージ㌠ECR リãƒã‚¸ãƒˆãƒªã«ãƒ—ッシュã•れる㨠Copilot ã¯å¿…è¦ãªã™ã¹ã¦ã®ãƒªã‚½ãƒ¼ã‚¹ã®ä½œæˆã‚’é–‹å§‹ã—ã€ãƒ—ãƒãƒ“ジョニングãŒå®Œäº†ã™ã‚‹ã¨ã‚¢ãƒ—リケーションã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãる安全㪠URL ãŒå–å¾—ã•れã¾ã™ã€‚ å°†æ¥çš„ã«ã“ã® URL ã‚’å–å¾—ã—ãŸã„å ´åˆã¯ã€`copilot svc show --name demo-service` を実行ã—ã€_Routes_ セクション㮠URL ã®å€¤ã‚’コピーã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ### å‹•ä½œç¢ºèª ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã™ã‚‹ãŸã³ã«ã€æ–°ã—ã„åå‰ã¨é›»åメールãŒç”Ÿæˆã•れã¾ã™ãŒã€å¿…è¦ã«å¿œã˜ã¦ãƒ•ィールドを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚  Send をクリックã™ã‚‹ã¨ã€SQLAlchemy ã¯ã€ä½œæˆã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ (demo) ã¨ã€Python ã®ã‚³ãƒ¼ãƒ‰ã§ (`__tablename__ = 'users'`) ã¨æŒ‡å®šã—ãŸãƒ†ãƒ¼ãƒ–ル '`users`' ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’ SQL Insert ã—ã¾ã™ã€‚ フãƒãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã‚’使用ã—ã¦ã€è¤‡æ•°ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’è¿½åŠ ã—ã¾ã™ã€‚ユーザーãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ä¿å˜ã•れãŸã“ã¨ã‚’確èªã™ã‚‹ã«ã¯ã€ãƒ•ãƒãƒ³ãƒˆã‚¨ãƒ³ãƒ‰ã® Users セクションã«è¡Œãã€ä¿å˜ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚  ã•らã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæœ¬å½“ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«å˜åœ¨ã™ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã«ã€[RDS コンソールã®ã‚¯ã‚¨ãƒªã‚¨ãƒ‡ã‚£ã‚¿](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/query-editor.html) を使用ã™ã‚‹ã¨ã€æ¨™æº– SQL ステートメントを使用ã—ã¦ãƒ‡ãƒ¼ã‚¿å®šç¾©è¨€èªž (DDL) ãŠã‚ˆã³ãƒ‡ãƒ¼ã‚¿æ“作言語 (DML) を実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ デフォルトã§ã¯ã“ã®æ©Ÿèƒ½ã¯æœ‰åйã«ãªã£ã¦ã„ãªã„ãŸã‚ã€æ‰‹å‹•ã§ãƒ‡ãƒ¼ã‚¿ API を有効ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚    ã“ã®æ©Ÿèƒ½ã‚’有効ã«ã—ãŸå¾Œã€SELECT ã®ã‚ˆã†ãª SQL 文を実行ã—ã¦ã€æŒ¿å…¥ã•れãŸãƒ‡ãƒ¼ã‚¿ãŒå®Ÿéš›ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã«ã‚ã‚‹ã‹ã©ã†ã‹ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚  ### クリーンアップ 今後ã®èª²é‡‘ã‚’é¿ã‘ã‚‹ãŸã‚ã€ãƒªã‚½ãƒ¼ã‚¹ã‚’削除ã—ã¦ãã ã•ã„。ã™ã¹ã¦æ£ã—ã作æˆã•れã¦ã„ã‚‹å ´åˆã¯ã€æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã—ã¾ã™ã€‚ `copilot app delete apprunner-vpc` 以上ã§ã€ã“ã®ãƒ‡ãƒ¢ã®ãŸã‚ã«ä½œæˆã•れãŸã™ã¹ã¦ã® Service ã¨é–¢é€£ã™ã‚‹ã‚¤ãƒ³ãƒ•ラã¯å‰Šé™¤ã•れã¾ã™ã€‚ ## ã¾ã¨ã‚ AWS Copilot 㨠AWS App Runner ã®æ–°ã—ã„ VPC 接続機能を使ã£ã¦ã€ãƒ—ライベート VPC ãƒªã‚½ãƒ¼ã‚¹ã«æŽ¥ç¶šã™ã‚‹æ–¹æ³•を紹介ã—ã¾ã—ãŸã€‚ã“ã® 2 ã¤ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€VPC ãƒªã‚½ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãã‚‹ HTTP ベースã®ã‚µãƒ¼ãƒ“スを簡å˜ã«ãƒ‡ãƒ—ãƒã‚¤ã§ãã€Copilot ã¯ã‚¤ãƒ³ãƒ•ラストラクãƒãƒ£ã¨ãƒ‘ーミッションã®ä½œæˆã®è¤‡é›‘ã•ã‚’ã™ã¹ã¦éš 蔽ã™ã‚‹ã“ã¨ã§ã€çµæžœçš„ã«æ™‚間を節約ã—ã¦ç®¡ç†ã‚’ç°¡ç´ åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ã™ã€‚ 翻訳ã¯ã‚½ãƒªãƒ¥ãƒ¼ã‚·ãƒ§ãƒ³ã‚¢ãƒ¼ã‚ãƒ†ã‚¯ãƒˆã®æ‰æœ¬ãŒæ‹…当ã—ã¾ã—ãŸã€‚