【AWS】 RDS Proxy를 CloudFormation으로 구축

RDS Proxy가 2020/6/30에 GA되었습니다.
최근 RDS Proxy에 접할 기회가 있어, 바삭바삭하게 지울 수 있도록 CloudFormation(이하 CFn이라고 약)을 사용해 구축했습니다. 그 때 쓴 CFn 템플릿을 예로 소개합니다.

RDS 프록시에 대한 자세한 내용과 운영에 대한 정보는 다루지 않으므로 공식 문서 등을 참조하십시오.

요구사항


  • 프록시 대상은 Aurora
  • 사용자 및 암호의 일반 인증
  • Secrets Manager 사용

  • TLS는 필수가 아님

  • 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


  • htps : // 아 ws. 아마존. 이 m / jp / b ぉ gs / 아 ws / 아마 존 - rds - p 로 xy - w- 게 네라 ly - 아 아 이 b b /
  • htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / 아 WSC ぉ う ふぉ r 마치 온 / ぁ st / うせ r グ イ ー / 아 ws - 할 수 r せ rds - dbp 로 xy. HTML
  • htps : // / cs. 아 ws. 아마존. 이 m / 그럼 _ jp / 아 WSC ぉ う ふ ぉ r 마치 온 / ㅁ st / 우세 r 구이로 / 아 ws - 그렇게 r 썰 rds-dbp 로 xy 타 r 게 tg 브 p. HTML
  • 좋은 웹페이지 즐겨찾기