AWSサンプル - AWS LambdaをVPCに配置

概要

LambdaをVPCと繋ぎ、プライベートサブネットにあるRDS Proxyを経由してRDSに接続するサンプル。

構成

フロントはVue3、バックエンドはSAM(Python)で構成する。 DBはAurora MySQLを使用する。

ローカル実行

  1. Dockerのネットワークの作成
    1. docker network create vpc-lambda-network
  2. DB環境の構築と起動
    1. docker-compose up
  3. S3バケットの作成
    1. ローカル用にS3バケットを作成する
  4. バックエンドの起動
    1. cd api
    2. sam build --cached
    3. sam local start-api --docker-network vpc-lambda-network --parameter-overrides Timeout=10 DBHost=db DBUser=admin DBPassword=admin BackendBucketName=<ローカル用バケット名>
      1. ファイルを編集した場合はsam buildを実行する必要がある
      2. IDEなどのファイル監視で、sam buildが実行されるようにすると少し楽になる
      3. JetBrains製品の場合は、File Watcherでbuild.shを実行するようにすると自動でビルドが走るようにできる
  5. フロントの起動
    1. cd front
    2. npm run dev

AWS環境の構築手順

  1. Terraform実行
    1. infra/terra/main.tfvarsを作成し、infra/terra/variables.tfの変数を設定する
    2. cd infra/terra
    3. terraform init
    4. terraform plan --var-file main.tfvars
    5. terraform apply --var-file main.tfvars
  2. 踏み台に入ってDB登録
    1. AWSコンソールからEC2にいき、踏み台EC2のセッションマネージャーで接続する
      1. sudo su - ec2-userec2-userに切り替える(切り替えなくてもできるが切り替えた方がやりやすい)
      2. ※Session Manager プラグインを利用してローカルPCからのログインも可能
    2. mysqlコマンドでDBに接続し、server/mysql/initdb.d/init.sqlのSQLを実行する
      1. DBのエンドポイントはTerraformの出力結果のRDS Proxyに記載されている
      2. DBのユーザ名とパスワードはTerraformの変数で指定したものを使う
      3. mysql -u <ユーザ名> -p -h <DBのエンドポイント>
  3. SAMでAPIのビルド&デプロイ
    1. cd api
    2. sam build
    3. sam deploy --guided --no-confirm-changeset
      1. Stack Nameは任意の名前をつける
      2. AWS RegionはTerraformで作成したリージョンと同じにする
      3. LambdaSubnet1はTerraformの出力結果のprivate_subnet_app_1_idに出力された値を設定する
      4. LambdaSubnet2はTerraformの出力結果のprivate_subnet_app_2_idに出力された値を設定する
      5. LambdaRoleはTerraformの出力結果のvpc_lambda_role_arnに出力された値を設定する
      6. LambdaSecurityGroupはTerraformの出力結果のvpc_lambda_security_group_idに出力された値を設定する
      7. BackendBucketNameはTerraformの出力結果のbackend_bucket_nameに出力された値を設定する
      8. DBHostはTerraformの出力結果のrds_proxy_hostに出力された値を設定する
      9. DBUserはTerraformの変数で指定した値を設定する
      10. DBPasswordはTerraformの変数で指定した値を設定する
      11. 他の入力はデフォルトとする
  4. フロントのビルド&デプロイ
    1. front/.env.productionを作成し、VUE_APP_API_URLにAPIのエンドポイントを設定する
      1. APIのエンドポイントはSAMのデプロイの出力結果のProductionApiに出力された値を設定する
    2. cd front
    3. npm run build
    4. aws s3 sync ./dist <バケットURI> --delete
      1. バケットURIはTerraformの出力結果のfrontend_bucket_uriに出力された値を設定する

動作確認

  1. フロントのURLにアクセスし、メッセージを登録する
    1. フロントのURLはTerraformの出力結果のcloud_front_urlに出力された値を使用し、HTTPSでアクセスする
  2. 登録したメッセージがテキストボックスの下に表示されることを確認する
  3. 踏み台に入ってDBに接続し、messagesテーブルに登録されていることを確認する
  4. ブラウザをリロードし、テキストボックスの下に登録したメッセージが表示されることを確認する

リソース削除

  1. SAMのスタック削除
    1. cd api
    2. sam delete
      1. 確認の入力が求められるのですべてyを入力する
  2. S3のバケットの中身を削除
    1. aws s3 rm <バケットURI> --recursive
      1. バケットURIはTerraformの出力結果のfrontend_bucket_s3_uriに出力された値を設定する
      2. バケットURIはTerraformの出力結果のbackend_bucket_uriに出力された値を設定する
  3. Terraformのリソース削除
    1. cd infra/terra
    2. terraform destroy --var-file main.tfvars

TODO

  • Cloud Watch Logsのロググループを作成する
  • シークレットマネージャーからのDB情報の取得(ローカル時は環境変数から取得する)
  • テストコード
  • CI/CD
  • ログ出力
  • ログの集約
  • ログの可視化
  • モニタリング