Kotlin + SpringBoot + JPA + Querydsl マルチモジュールプロジェクトを設定する

Kotlin+Spring開発時、JpaとQuerydslも利用したい場合、Gradleを利用して、マルチモジュールプロジェクトを設定する方法をまとめてみました。 全てのコードは Github にアップされています。 バージョン Spring Boot 2.6.4 Gradle 7.4 Java 17 Postgres 13 プロジェクト構成 ApiプロジェクトはDomainプロジェクトを利用します。 ApiプロジェクトにはServiceとControllerなどが入っていて、DomainプロジェクトにはEntityとRepositoryが入っています。 C:. │ .gitignore │ build.gradle.kts │ docker-compose.yml │ gradle.properties │ gradlew │ gradlew.bat │ README.md │ settings.gradle.kts │ ├───api ## Service, Controller │ │ build.gradle.kts │ │ │ └───src │ ├───main │ │ ├───java │ │ ├───kotlin │ │ │ └───com │ │ │ └───study │ │ │ └───jpashop │ │ │ └───api │ │ │ │ │ └───resources │ │ application....

2022-03-23 · bokyung

AWS Secrets Managerを利用して、Redshiftのパスワードを自動的にローテーションさせる

redshift-data cliを利用して、sqlを実行する時に、認証方法としてAWS Secrets Managerを利用したいと思います。 Secrets Managerコンソール上で新たなシークレットを作成し、Redshiftのパスワードを自動ローテーションさせる設定までやってみました。 構成 Redshiftクラスターはbastionサーバーを利用し、外部からのアクセスを可能にし、パスワードを自動ローテーションさせるLambdaはNATゲートウェイでなはく、VPCエンドポイントを通すように設定しました。 シークレット作成と自動ローテーション設定 新たなシークレットを作成します。Redshiftクラスターのユーザー名とパスワードを入力し、対象クラスターを選びます。KMSキーはデフォルトを選びました。 自動ローテーションを有効にし、ローテーション間隔を入力し、新しいLambda関数を作成します。 しかし、自動作成されるCloudformationスタック作成に失敗しました。サブネットの数超過による失敗でした。 Properties validation failed for resource SecretsManagerRedshiftRotationSingleUser with message: #/VpcConfig/SubnetIds: expected maximum item count: 16, found: 20 手動で自動ローテーション再設定 失敗したCloudformationスタックを削除し、同じテンプレートでスタックを再度作成します。 パラメーターは失敗したスタックと同じ値を入力し、サブネットはLambdaを作成するサブネットを入力します。 Key Value kmsKeyArn - excludeCharacters :/@"'\ functionName SecretsManagerRedshiftRotationLambda endpoint https://secretsmanager.ap-northeast-1.amazonaws.com invokingServicePrincipal secretsmanager.amazonaws.com vpcSecurityGroupIds sg-0b3xxxcfa vpcSubnetIds subnet-0e171673999462f90,subnet-0c21ae038cbe71f48 Cloudformationスタック作成が完了したら、シークレット自動ローテーション設定画面を開き、作成されたLambda関数を選択します。 Lambda実行失敗 Lambda関数に設定したSecurity GroupはRedshiftへ設定されたSecurity Groupと同じです。(自動でLambda関数が作成される場合もRedshiftクラスターと同様なSecurity Groupが設定されます。) Redshiftへ設定されているSecurity GroupはAWS Secrets Managerが作成するLambda関数のInboundアクセスの許可が必要です。 [ERROR] d352ae22-3b4b-4203-88cf-224160303d56 setSecret: Unable to log into database with previous, current, or pending secret of secret arn arn:aws:secretsmanager:ap-northeast-1:xxxx:secret:dev/Demo/Redshift-8c3rDL [ERROR] ValueError: Unable to log into database with previous, current, or pending secret of secret arn arn:aws:secretsmanager:ap-northeast-1:xxxx:secret:dev/Demo/Redshift-8c3rDL Security GroupへInboundアクセス追加 Redshift Security GroupへSecurity Group自身からRedshiftへアクセスできるようにInboundアクセスを追加 すぐにシークレットをローテーションさせるを実行 正常にパスワードが変更されました。...

2021-07-26 · bokyung

AWS SAMを利用して、Lambda関数デプロイする

前のPostに CloudFrontとLambda@Edgeを利用して画像をリサイズさせる 方法に関する内容がありましたが、AWS SAMを利用してCloudFormationでLambda関数をデプロイする方法をまとめてみました。 デプロイ順番 SAM CLIインストール Install SAM CLI 私は SAM CLI, version 1.23.0を利用しました。 template.yaml作成 CloudFormation基盤のテンプレート(template.yaml)を作成します。 . ├── index.js ├── node_modules/ ├── template.yaml ├── package-lock.json └── package.json SAM deployを利用した、コードのパッケージングとデプロイ SAM deploy \ --template-file template.yaml \ # Lambda@edgeの場合はus-east-1リージョンに作成したBucketが必要です。 --s3-bucket <zipファイルをアップロードするBucket name> \ --s3-prefix SAM \ --stack-name <cloudformation スタック名> \ --capabilities CAPABILITY_NAMED_IAM \ --region <cloudformationをデプロイするリージョン名> \ --profile <profile name> SAMはデプロイ時、 アプリケーションのコードを圧縮して、S3へアップロード CodeUriがS3 pathに変換されたCloudFormationテンプレートファイル作成、S3へアップロード S3にアップロードされたファイルを利用して、Cloudformationのスタック作成してデプロイ Cloudformationコンソール上でTemplateの中身を確認するとCodeUriがS3のパスになっていることが確認できます。 CodeUri: s3://<zipファイルをアップロードするBucket name>/SAM/70b53b458e040c19f27aaf1d7f197e0e Cloudformationのスタック作成が完了されたら、OutputsにLambda関数の新たなバージョンを含めたARNを表示してくれます。 このARNをCloudfrontのリサイズ用のBehaviors > Edge Function Associations > Function ARN/Nameへ指定します。...

2021-05-17 · bokyung

CloudFrontとLambda@Edgeを利用して画像をリサイズさせる

リサイズされた画像をS3へ保存せずに、原本のみ利用してリサイズさせる方法がないか調べてみましたが、Lambda@Edgeを利用してリサイズさせる方法があったので、試してみました。 Lambda@Edge動作概要 Lambda@EdgeはCloudFrontへアクセスする時に実行されるLambdaの拡張版です。 CloudFrontイベント発生時、Lambda関数の実行が可能です。 イベントには4種類があります。 Viewer Request : CloudFrontがビューアーからのリクエストを受け、リクエストしたオブジェクトがedge cacheにあるかを確認する前に関数を実行します。 Origin Request : CloudFrontがオリジンにリクエストを渡す場合のみ実行されます。 リクエストしたオブジェクトがedge cacheにある場合は関数は実行されません。 Origin Response : CloudFrontがオリジンからレスポンスを受け取った後、レスポンスへオブジェクトをcacheする前に関数を実行します。 Viewer Response : リクエストしたオブジェクトをビューアーに返却する前に実行されます。 この関数は、オブジェクトがedge cacheに既に存在しているか否かに関わらず実行されます。 Lambda@Edge 注意点 環境変数は利用不可 us-east-1 リージョンのみ対応 イベントタイプによって異なるクォータ Entity Origin request and response event quotas Viewer request and response event quotas Function memory size Same as Lambda quotas(128 MB to 10,240 MB) 128 MB Function timeout 30 seconds 5 seconds Size of a response 1 MB 40 KB Maximum compressed size of a Lambda function and any included libraries 50 MB 1 MB イメージリサイジング処理実装 イメージリサイジング処理の流れ Origin Responseイベント発生時、Lambda@Edge関数を実行する方法を利用しました。...

2021-05-14 · bokyung

Sentryをreact.jsプロジェクトへ適用する

公式サイト の見ながらreact.jsプロジェクトにSentryを適用してみました。 バージョン react 17.0.1 Sentry @sentry/react 6.2.5 @sentry/tracing 6.2.5 Sentryへプロジェクト追加及び設定 Sentryへログイン後、プロジェクト作成。 Client Keys (DSN)メニューに書いてある、DSNキーをコピーしておきます。 sentry パッケージインストール npm install --save @sentry/react @sentry/tracing index.jsにSentryを初期化するコードを追加します。 import React from "react"; import ReactDOM from "react-dom"; import * as Sentry from "@sentry/react"; import { Integrations } from "@sentry/tracing"; import App from "./App"; import "./index.css"; Sentry.init({ // 全ての環境に設定時 dsn: "https://xxxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxx.ingest.sentry.io/xxxxx", // productionのみ設定時 dsn: process.env.NODE_ENV === "production" ? "https://xxxxxxxxxxxxxxxxxxxxxxxxxxx@xxxxxx.ingest.sentry.io/xxxxx" : false, integrations: [new Integrations.BrowserTracing()], environment: process.env.NODE_ENV, tracesSampleRate: 1....

2021-04-16 · bokyung