【AWS】 RDS Proxy를 CloudFormation으로 구축
14166 단어 RDSCloudFormation오로라AWS
최근 RDS Proxy에 접할 기회가 있어, 바삭바삭하게 지울 수 있도록 CloudFormation(이하 CFn이라고 약)을 사용해 구축했습니다. 그 때 쓴 CFn 템플릿을 예로 소개합니다.
RDS 프록시에 대한 자세한 내용과 운영에 대한 정보는 다루지 않으므로 공식 문서 등을 참조하십시오.
요구사항
CFn 템플릿
템플릿이 100줄을 넘었으므로 GitHub Gist에 업로드했습니다.
템플릿 전체를 보려면 homoluctus/rds_proxy.yml을 참조하십시오.
해설
Parameters
Parameters:
# DB Proxy
ProxyName:
Type: String
ProxyEngineFamily:
Type: String
AllowedValues:
- MYSQL
- POSTGRESQL
ProxyIdleClientTimeout:
Type: Number
ProxyRequireTLS:
Type: String
AllowedValues:
- true
- false
Default: false
ProxyVpcSecurityGroupIds:
Type: List<AWS::EC2::SecurityGroup::Id>
ProxyVpcSubnetIds:
Type: List<AWS::EC2::Subnet::Id>
# DB Proxy Target Group
ProxyTargetConnectionBorrowTimeout:
Type: Number
ProxyTargetMaxConnectionsPercent:
Type: Number
ProxyTargetMaxIdleConnectionsPercent:
Type: Number
ProxyTargetDBClusterIdentifiers:
Type: CommaDelimitedList
# Secrets Manager
SecretsManagerRoleName:
Type: String
SecretsManagerName:
Type: String
SecretsManagerKMSKeyId:
Type: String
SecretsManagerManagedPolicyName:
Type: String
Resources
DB 프록시
RDSProxy:
Type: "AWS::RDS::DBProxy"
Properties:
Auth:
# Secrets Managerを利用してユーザ名とパスワードで認証
# 予めSecretsは作成しておく必要があり
- AuthScheme: SECRETS
IAMAuth: DISABLED
SecretArn: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${SecretsManagerName}"
# 作成するRDS Proxyの名前
DBProxyName: !Ref ProxyName
# 2020/08/17時点でMySQLとPostgreSQLがサポートされている
EngineFamily: !Ref ProxyEngineFamily
# Proxyとクライアント間の接続がアイドル状態の時に接続切断するまでの秒数
IdleClientTimeout: !Ref ProxyIdleClientTimeout
# TLSが必須かどうか
RequireTLS: !Ref ProxyRequireTLS
# RDS Proxyに設定するIAM Role
# 今回はSecrets Managerから値を取得して復号可能なRoleをアタッチ
RoleArn: !GetAtt SecretsManagerRole.Arn
# RDS Proxyにアタッチするセキュリティグループ
VpcSecurityGroupIds: !Ref ProxyVpcSecurityGroupIds
# RDS Proxyを構築するVPC Subnet
VpcSubnetIds: !Ref ProxyVpcSubnetIds
DB Proxy Target Group
이번에는 RDS Proxy 뒤에 RDS Aurora가 있다고 가정합니다.
RDSProxyTargetGroup:
Type: "AWS::RDS::DBProxyTargetGroup"
Properties:
# コネクションプールの設定
ConnectionPoolConfigurationInfo:
# コネクションプールが使用可能になるまでの待機秒数
# Proxyが使用可能な最大接続数を使い切っていて、その全接続を使用中の場合に適用される
ConnectionBorrowTimeout: !Ref ProxyTargetConnectionBorrowTimeout
# RDS 最大接続数のうちProxyが使用可能な接続数の割合
MaxConnectionsPercent: !Ref ProxyTargetMaxConnectionsPercent
# RDSへの接続数のうちアイドル状態の接続数の割合
# 上限はMaxConnectionsPercentで値が大きければ再度接続するオーバーヘッドが減少する
MaxIdleConnectionsPercent: !Ref ProxyTargetMaxIdleConnectionsPercent
# Proxyが接続するRDS Auroraクラスターの識別子
DBClusterIdentifiers: !Ref ProxyTargetDBClusterIdentifiers
# AWS::RDS::DBProxyで作成したRDS Proxyの名前
DBProxyName: !Ref RDSProxy
# ターゲットグループ名はdefaultを無条件に指定
# 2020/08/17時点ではdefaultであることが必須
TargetGroupName: default
IAM Policy
SecretsManagerManagedPolicy:
# 使いまわせるようにインラインポリシーではなくユーザ管理のポリシーを作成
Type: "AWS::IAM::ManagedPolicy"
Properties:
Description: "Get values from Secrets Manager"
ManagedPolicyName: !Ref SecretsManagerManagedPolicyName
Path: /
PolicyDocument:
Version: "2012-10-17"
Statement:
# Secrets ManagerからRDS Proxy用に作成したSecretsを取得
- Effect: Allow
Action:
- "secretsmanager:GetSecretValue"
Resource: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${SecretsManagerName}"
# 取得したSecretsを復号する
- Effect: Allow
Action:
- "kms:Decrypt"
Resource: !Sub "arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/${SecretsManagerKMSKeyId}"
Condition:
StringEquals:
kms:ViaService: !Sub "secretsmanager.${AWS::Region}.amazonaws.com"
IAM Role
SecretsManagerRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
# RoleをRDSに渡す
- Effect: Allow
Principal:
Service:
- "rds.amazonaws.com"
Action:
- "sts:AssumeRole"
Description: "Use for RDS Proxy"
# 作成したユーザ管理ポリシーを指定
ManagedPolicyArns:
- !Ref SecretsManagerManagedPolicy
Path: /
RoleName: !Ref SecretsManagerRoleName
끝에
안티 패턴으로 여겨진 Lambda + RDS의 구성을 해결하는 RDS Proxy는 훌륭하다
단지 SQL에 따라서는 고정이나 발생하므로 프로덕션으로 운용할 때는 신중하게 검토하는 것이 좋을 것입니다
Reference
Parameters
Parameters:
# DB Proxy
ProxyName:
Type: String
ProxyEngineFamily:
Type: String
AllowedValues:
- MYSQL
- POSTGRESQL
ProxyIdleClientTimeout:
Type: Number
ProxyRequireTLS:
Type: String
AllowedValues:
- true
- false
Default: false
ProxyVpcSecurityGroupIds:
Type: List<AWS::EC2::SecurityGroup::Id>
ProxyVpcSubnetIds:
Type: List<AWS::EC2::Subnet::Id>
# DB Proxy Target Group
ProxyTargetConnectionBorrowTimeout:
Type: Number
ProxyTargetMaxConnectionsPercent:
Type: Number
ProxyTargetMaxIdleConnectionsPercent:
Type: Number
ProxyTargetDBClusterIdentifiers:
Type: CommaDelimitedList
# Secrets Manager
SecretsManagerRoleName:
Type: String
SecretsManagerName:
Type: String
SecretsManagerKMSKeyId:
Type: String
SecretsManagerManagedPolicyName:
Type: String
Resources
DB 프록시
RDSProxy:
Type: "AWS::RDS::DBProxy"
Properties:
Auth:
# Secrets Managerを利用してユーザ名とパスワードで認証
# 予めSecretsは作成しておく必要があり
- AuthScheme: SECRETS
IAMAuth: DISABLED
SecretArn: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${SecretsManagerName}"
# 作成するRDS Proxyの名前
DBProxyName: !Ref ProxyName
# 2020/08/17時点でMySQLとPostgreSQLがサポートされている
EngineFamily: !Ref ProxyEngineFamily
# Proxyとクライアント間の接続がアイドル状態の時に接続切断するまでの秒数
IdleClientTimeout: !Ref ProxyIdleClientTimeout
# TLSが必須かどうか
RequireTLS: !Ref ProxyRequireTLS
# RDS Proxyに設定するIAM Role
# 今回はSecrets Managerから値を取得して復号可能なRoleをアタッチ
RoleArn: !GetAtt SecretsManagerRole.Arn
# RDS Proxyにアタッチするセキュリティグループ
VpcSecurityGroupIds: !Ref ProxyVpcSecurityGroupIds
# RDS Proxyを構築するVPC Subnet
VpcSubnetIds: !Ref ProxyVpcSubnetIds
DB Proxy Target Group
이번에는 RDS Proxy 뒤에 RDS Aurora가 있다고 가정합니다.
RDSProxyTargetGroup:
Type: "AWS::RDS::DBProxyTargetGroup"
Properties:
# コネクションプールの設定
ConnectionPoolConfigurationInfo:
# コネクションプールが使用可能になるまでの待機秒数
# Proxyが使用可能な最大接続数を使い切っていて、その全接続を使用中の場合に適用される
ConnectionBorrowTimeout: !Ref ProxyTargetConnectionBorrowTimeout
# RDS 最大接続数のうちProxyが使用可能な接続数の割合
MaxConnectionsPercent: !Ref ProxyTargetMaxConnectionsPercent
# RDSへの接続数のうちアイドル状態の接続数の割合
# 上限はMaxConnectionsPercentで値が大きければ再度接続するオーバーヘッドが減少する
MaxIdleConnectionsPercent: !Ref ProxyTargetMaxIdleConnectionsPercent
# Proxyが接続するRDS Auroraクラスターの識別子
DBClusterIdentifiers: !Ref ProxyTargetDBClusterIdentifiers
# AWS::RDS::DBProxyで作成したRDS Proxyの名前
DBProxyName: !Ref RDSProxy
# ターゲットグループ名はdefaultを無条件に指定
# 2020/08/17時点ではdefaultであることが必須
TargetGroupName: default
IAM Policy
SecretsManagerManagedPolicy:
# 使いまわせるようにインラインポリシーではなくユーザ管理のポリシーを作成
Type: "AWS::IAM::ManagedPolicy"
Properties:
Description: "Get values from Secrets Manager"
ManagedPolicyName: !Ref SecretsManagerManagedPolicyName
Path: /
PolicyDocument:
Version: "2012-10-17"
Statement:
# Secrets ManagerからRDS Proxy用に作成したSecretsを取得
- Effect: Allow
Action:
- "secretsmanager:GetSecretValue"
Resource: !Sub "arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:${SecretsManagerName}"
# 取得したSecretsを復号する
- Effect: Allow
Action:
- "kms:Decrypt"
Resource: !Sub "arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/${SecretsManagerKMSKeyId}"
Condition:
StringEquals:
kms:ViaService: !Sub "secretsmanager.${AWS::Region}.amazonaws.com"
IAM Role
SecretsManagerRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
# RoleをRDSに渡す
- Effect: Allow
Principal:
Service:
- "rds.amazonaws.com"
Action:
- "sts:AssumeRole"
Description: "Use for RDS Proxy"
# 作成したユーザ管理ポリシーを指定
ManagedPolicyArns:
- !Ref SecretsManagerManagedPolicy
Path: /
RoleName: !Ref SecretsManagerRoleName
끝에
안티 패턴으로 여겨진 Lambda + RDS의 구성을 해결하는 RDS Proxy는 훌륭하다
단지 SQL에 따라서는 고정이나 발생하므로 프로덕션으로 운용할 때는 신중하게 검토하는 것이 좋을 것입니다
Reference
Reference
이 문제에 관하여(【AWS】 RDS Proxy를 CloudFormation으로 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/homines22/items/be6c9565ddd615d1d9ac텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)