AWS RDS Proxy를 사용하여 Lambda에서 데이터베이스 연결 공유
짧은 함수에서 실행 코드의 신축성 때문에 Serverless는 지난 몇 년 동안 광범위하게 응용되었다.이것은 아주 좋습니다. 항상 온라인 서버가 데이터를 받지 않을 때 빈 상태로 두지 않고, 절대적으로 필요할 때 코드를 실행하기만 하면 됩니다.그러나 시간이 좀 걸려야 따라잡을 수 있는 일 중 하나는 서버 기능이 없는 데이터베이스 연결을 구축하는 것이다.
항상 온라인 서버에서 코드를 실행할 때, 데이터베이스에 연결되면, 응용 프로그램은 데이터베이스 연결 탱크를 자동으로 처리합니다.
연결 탱크는 일정한 수량의 데이터베이스 연결이 활성 상태를 유지하는 것을 말한다. 이렇게 하면 데이터베이스의 요청 전송을 조회해야 할 때 매번 새로운 연결을 만들 필요가 없고 연결 탱크에서 기존 연결을 빌려 쓸 수 있다.이것은 데이터베이스의 CPU와 메모리 사용을 절약한다. 데이터베이스에 대한 유일한 호출은 조회 데이터의 호출이지 연결을 동시에 만들거나 닫는 것이 아니기 때문이다.람바다 함수에서 우리는 그런 사치가 없다. 이것은 이미 한동안 문제였다.
Lambda 함수는 무상태와 비동기적이기 때문에 한 함수의 상태가 후속 Lambda 호출에 전달되지 않기 때문에 데이터베이스 연결이 활성 상태를 유지할 수 없습니다.함수가 실행되는 동안 모든 데이터베이스 연결을 열고 닫아야 합니다.이것은 많은 사람들에게 하나의 문제이다. 이 문제를 완화시키는 유일한 진정한 방법은 lambda의 합병성을 제어하여 그들이 확장할 때 데이터베이스에 잠기지 않도록 하는 것이다.lambda가 아직 매우 더울 때 일부 해결 방안은 연결을 성공적으로 다시 사용했지만 이것은 이상적이지 않고 서버 체계 구조에서 매우 뚜렷한 문제의 해결 방안이 아닌 해커 행위인 것 같다.
RDS 에이전트 소개
AWS는 이 문제를 해결하기 위해 RDS 에이전트를 도입했습니다.데이터베이스 앞에서 RDS 에이전트를 사용할 때, 이 에이전트는 연결 탱크를 관리하고, 새로운 연결을 만드는 대신 Lambda 함수를 빌려 쓸 수 있도록 합니다.그리고 당신의 에이전트는 당신의 요청을 RDS에 전송하고 결과를 되돌려줍니다.Lambda 함수에 대한 속도와 확장성을 제공하는 것 외에 주 데이터베이스에 고장이 나면 에이전트는 자동으로 예비 데이터베이스로 페일오버하며 응용 프로그램 연결을 유지합니다.Proxy는 Proxy가 허용하는 연결 수를 제어할 수 있으며, 연결이 너무 많아서 데이터베이스 고장을 줄이는 데 도움이 됩니다.즉, 허용되는 최대 연결 수의 80%만 사용하도록 설정하여 데이터베이스 과부하를 방지할 수 있습니다.확장에 확실히 도움이 되지만 데이터베이스에서 허용하는 최대 연결 수의 제한을 받는다.
RDS Proxy는 데이터베이스에 추가 보안을 추가할 수도 있습니다.Secrets Manager에 저장된 데이터베이스 자격 증명을 사용하여 데이터베이스에 연결되지만, Lambda는 AWS SDK를 사용하여 서명 암호를 생성하여 IAM 인증을 사용하여 에이전트에 연결할 수 있습니다.
이것은 응용 프로그램이 RDS 에이전트를 통해 데이터베이스를 조회할 때 발생하는 신분 검증 과정의 좋은 총결이다.
신용장: https://aws.amazon.com/blogs/compute/introducing-the-serverless-lamp-stack-part-2-relational-databases/
MySQL RDS에 대한 RDS 에이전트 사용 방법
RDS Proxy를 사용하려면 다음과 같은 핵심 구성 요소가 필요합니다.
DbProxy:
Type: AWS::RDS::DBProxy
Properties:
Auth:
- AuthScheme: SECRETS # Proxy will use credentials in Secrets Manager to authenticate with the DB
SecretArn: !Ref: DbUserSecret
IAMAuth: REQUIRED # Connections to the Proxy must use IAM auth
DebugLogging: true
DBProxyName: my-db-proxy
EngineFamily: MYSQL
IdleClientTimeout: 1800
RequireTLS: true
VpcSubnetIds:
- !Ref: PrivateSubnet
VpcSecurityGroupIds:
- !Ref: ProxySG
RoleArn: !GetAtt: [ProxyRole, Arn]
RDS를 데이터베이스에서 인증하려면 Secrets Manager에 저장된 자격 증명을 참조해야 합니다.또한 이러한 자격 증명을 사용하는 데이터베이스 사용자를 만들어야 합니다.나는 한 데이터베이스 사용자가 유한한 선택, 업데이트, 삽입, 삭제 권한을 사용하여 정기적으로 데이터베이스를 조회하고 다른 사용자는 변경표 등 권한을 사용하여 데이터베이스 이전을 실행할 것을 건의한다.두 사용자의 자격 증명은 모두 Secrets Manager에 저장되고 프록시 구성에서 참조되어야 합니다.다음은 Secrets Manager에서 기밀을 만드는 템플릿입니다. 위의 구성에서 템플릿을 참조할 수 있습니다.
AppDbUser:
Type: AWS::SecretsManager::Secret
Properties:
Name: app-db-user
Description: Application user for serverless app
GenerateSecretString:
SecretStringTemplate: '{ "username": "appUser"}'
GenerateStringKey: "password"
PasswordLength: 30
ExcludeCharacters: '"@/\' # MySQL doesn't like these characters
다음은 요청을 어느 데이터베이스로 전송하고 싶은지 에이전트에게 알려야 합니다.이렇게 하려면 Proxy Target Group을(를) 생성해야 합니다.ProxyTargetGroup:
Type: AWS::RDS::DBProxyTargetGroup
Properties:
DBProxyName: !Ref: DbProxy
DBInstanceIdentifiers:
- !Ref: MasterDbInstance
TargetGroupName: default
ConnectionPoolConfigurationInfo:
MaxConnectionsPercent: 50
MaxIdleConnectionsPercent: 12
ConnectionBorrowTimeout: 30
대상 그룹은 에이전트를 데이터베이스에 연결하는 도구입니다.서로 다른 구성을 가진 여러 대상 그룹을 가질 수 있습니다.현재, 일반적인 데이터베이스 연결의 실례처럼 프록시 노드에 연결하기만 하면 됩니다.유일한 차이점은 일반적인 데이터베이스 자격 증명이 아닌 AWS sdk를 사용하여 서명 암호를 생성하는 것입니다.
const { DB_HOST, DB_USERNAME, DB_NAME } = process.env;
const signer = new AWS.RDS.Signer({
region: '[REGION]',
hostname: DB_HOST, // The proxy endpoint
port: 3306,
username: DB_USERNAME
});
const token = signer.getAuthToken({
username: DB_USERNAME
});
const connectionConfig = {
host: DB_HOST
user: DB_USERNAME,
database: DB_NAME
ssl: { rejectUnauthorized: false },
password: token,
authSwitchHandler: function ({pluginName, pluginData}, cb)
// See here: https://dev.mysql.com/doc/internals/en/clear-text-authentication.html
console.log("Setting new auth handler.");
}
};
이제 사용자가 선택한 데이터베이스 라이브러리에서 이 연결 설정(또는 비슷한 버전)을 사용할 수 있습니다.현재 lambda는 데이터베이스 연결 시간이 진정으로 줄어드는 것을 볼 수 있습니다. 이제 푹 주무실 수 있습니다.이것은 RDS Proxy에 대한 아주 짧고 얕은 소개이지만, 나는 그것의 장점을 보여주고, 내가 처음 그것을 사용했을 때 겪었던 문제점을 분명히 할 수 있기를 바란다.RDS Proxy를 깊이 연구하는 데 관심이 있는 모든 사람들에게 다음과 같은 좋은 자원이 있기를 바랍니다.
Reference
이 문제에 관하여(AWS RDS Proxy를 사용하여 Lambda에서 데이터베이스 연결 공유), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/raucoustortoise/using-aws-rds-proxy-to-pool-database-connections-from-lambda-5h43텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)