Skaluj nowoczesne aplikacje bezserwerowe dzięki Amazon RDS Proxy dla SQL Server

3 października 2022

skalowanie nowoczesnych aplikacji

Wiele aplikacji, w tym te zbudowane na nowoczesnych architekturach bezserwerowych, może mieć dużą liczbę otwartych połączeń z serwerem bazy danych. Jednocześnie może otwierać i zamykać połączenia z bazą danych z dużą szybkością, wyczerpując pamięć bazy danych i zasoby obliczeniowe. Bazy danych mogą również cierpieć z powodu przejściowych awarii, które wpływają na dostępność aplikacji. Wreszcie aplikacje muszą utrzymywać poświadczenia bazy danych, aby łączyć się z bazami danych, zwiększając ryzyko ujawnienia i zmniejszając bezpieczeństwo.

W dniu dzisiejszym twórcy z przyjemnością ogłaszają, że RDS Proxy obsługuje teraz RDS dla SQLServer. W tym artykule omawiają to, jak Amazon RDS Proxy z RDS dla SQL Server może pomóc złagodzić te problemy, aby Twoja aplikacja była bardziej skalowalna, bardziej odporna na awarie bazy danych i przy tym bezpieczniejsza.

SQL Server to system zarządzania relacyjnymi bazami danych opracowany przez firmę Microsoft. Amazon RDS dla SQL Server ułatwia konfigurację, obsługę i skalowanie wdrożeń SQL Server w chmurze. Dzięki Amazon RDS możesz w ciągu kilku minut wdrożyć wiele wersji SQL Server (2014, 2016, 2017 i 2019), w tym Express, Web, Standard i Enterprise, korzystając z ekonomicznej i skalowalnej mocy obliczeniowej. Twórcy posiadają dziesięcioletnie doświadczenie w obsłudze i skalowaniu obciążeń baz danych dla klientów w chmurze. Jedną z korzyści płynących z prowadzenia relacyjnych baz danych w Amazon RDS jest to, że eliminuje znaczny wysiłek związany z zarządzaniem i skalowaniem baz danych, co pozwala skupić się na osiągnięciu sukcesu przez klientów. Twórcy dokonują tego, czyniąc bazy danych łatwiejszymi w administrowaniu, skalowalnymi, dostępnymi i trwałymi, a co najważniejsze – bezpiecznymi i zgodnymi.

Korzyści z RDS Proxy z RDS dla SQLServer

RDS Proxy to w pełni zarządzana usługa proxy bazy danych o wysokiej dostępności. Nie musisz więc udostępniać dodatkowej infrastruktury ani zarządzać nią, aby zacząć korzystać z RDS Proxy. Ponadto RDS zajmuje się czynnościami konserwacyjnymi, takimi jak naprawianie i aktualizowanie RDS Proxy w Twoim imieniu. W tej sekcji autorzy omówią, w jaki sposób RDS Proxy z SQL Server może pomóc zwiększyć skalowalność aplikacji, zwiększyć ich odporność na awarie bazy danych i zwiększyć bezpieczeństwo.

W miarę jak współczesne aplikacje przechodzą w stronę mikrousług, architektury bezserwerowe umożliwiają ich szybkie skalowanie. Na przykład aplikacje oparte na technologiach, takich jak Serverless, PHP lub Ruby on Rails, mogą często otwierać i zamykać połączenia z bazą danych w celu obsługi żądań aplikacji. Częste nawiązywanie tysięcy nowych połączeń pochłania zasoby bazy danych, które w innym przypadku mogłyby zostać wykorzystane do przetwarzania zapytań. W takich przypadkach RDS Proxy utrzymuje pulę połączeń bazy danych między aplikacją a bazą danych, aby uniknąć niepotrzebnego obciążania mocy obliczeniowej bazy danych i pamięci przez nawiązywanie nowych połączeń. RDS Proxy współdzieli również połączenia z bazą danych z wieloma połączeniami aplikacji, gdy jest to bezpieczne. Szczególnie pomaga to aplikacjom, które utrzymują bezczynne połączenia lub mają wystarczający czas na namysł między różnymi transakcjami w sesji. Udostępniając te same połączenia bazy danych wielu połączeniom aplikacji, RDS Proxy może pomóc w zmniejszeniu liczby połączeń z bazą danych zaplecza, co z kolei pomaga zmniejszyć zużycie procesora i pamięci w bazie danych.

Aby zapewnić ciągłość biznesową, klient chce zabezpieczyć się przed przejściowymi awariami bazy danych i poprawić dostępność aplikacji. Amazon RDS automatycznie wykrywa przejściowe błędy bazy danych i wykonuje przełączanie awaryjne bez konieczności interwencji.

RDS Proxy dodatkowo pomaga poprawić dostępność aplikacji, zapewniając przejrzystość przełączania awaryjnego i skracając czas przełączania awaryjnego bazy danych. RDS Proxy sprawia, że przełączanie awaryjne jest transparentne, automatycznie kierując ruch do nowej instancji bazy danych, zachowując jednocześnie połączenia aplikacji i zmniejszając potrzebę pisania złożonego kodu obsługi awarii. Podczas pracy awaryjnej bazy danych aplikacja może doświadczać zwiększonych opóźnień i może być konieczne ponawianie trwających transakcji. RDS Proxy może pomóc w skróceniu czasów przełączania awaryjnego, omijając pamięci podręczne DNS (Domain Name System) w przypadku wdrożeń Multi-AZ. Usługa RDS dla programu SQL Server obsługuje wdrożenia Multi-AZ w celu zapewnienia wysokiej dostępności za pośrednictwem dublowania bazy danych programu SQL Server lub zawsze włączonych grup dostępności.

Gdy nastąpi przełączenie awaryjne, klient musi wykryć awarię połączenia, odkryć nowy serwer podstawowy i jak najszybciej połączyć się z nim ponownie. Jednak gdy klient łączy się z bazą danych przy użyciu nazwy DNS, musi najpierw przetłumaczyć ją na adres IP, wysyłając zapytanie do serwera DNS. Klient następnie buforuje odpowiedzi. W zależności od protokołu odpowiedzi DNS określają „czas życia” (TTL), który definiuje, jak długo klient powinien buforować rekord. Dzięki zoptymalizowanym ustawieniom TTL i limitowi czasu wynoszącemu 10 sekund, RDS Proxy skraca czas przełączania awaryjnego nawet o 36% w stosunku do połączenia z punktem końcowym odbiornika Always On, 59% w stosunku do bezpośredniego połączenia z punktem końcowym RDS i 83% w stosunku do połączenia z serwerem SQL punktu końcowego dublowania bazy danych.

Poniższy test jest wykonywany na instancji m5.xlarge RDS dla SQL Server, która demonstruje poprawę limitów czasu przy użyciu Amazon RDS Proxy dla SQL Server.

Korzyści z RDS Proxy z RDS dla SQLServer

Korzyści z RDS Proxy z RDS dla SQLServer

Korzystając z RDS Proxy, możesz zwiększyć bezpieczeństwo aplikacji, korzystając z uwierzytelniania AWS Identity and Access Management (IAM) do łączenia się z bazą danych, eliminując w ten sposób potrzebę przechowywania poświadczeń bazy danych w kodzie aplikacji lub statycznych plikach konfiguracyjnych.

Omówienie rozwiązania

Twoja aplikacja może działać w PHP, Ruby lub .NET lub w aplikacji bezserwerowej, takiej jak AWS Lambda lub kontenery. Twoje aplikacje łączą się z serwerem proxy RDS, który z kolei łączy się z wewnętrzną bazą danych RDS SQL Server. RDS Proxy nie jest pojedynczą instancją; jest to wysoce dostępny serwer proxy o wielu instancjach, który jest rozmieszczony w wielu strefach dostępności, aby zapewnić wysoką dostępność i skalę, jakiej można oczekiwać od usługi bezserwerowej. Poniższy diagram ilustruje działanie serwera proxy RDS.

Korzyści z RDS Proxy z RDS dla SQLServer

Skonfiguruj wymagania wstępne dotyczące sieci

Korzystanie z RDS Proxy wymaga posiadania wspólnej wirtualnej chmury prywatnej Amazon między instancją RDS DB a RDS Proxy. Ta sieć VPC powinna mieć co najmniej dwie podsieci znajdujące się w różnych strefach dostępności. Twoje konto może być właścicielem tych podsieci lub udostępniać je innym kontom. Więcej informacji o udostępnianiu VPC znajdziesz w artykule „Share your VPC with other accounts”. Zasoby aplikacji klienckich, takie jak Amazon Elastic Compute Cloud (Amazon EC2), Lambda lub Amazon Elastic Container Service (Amazon ECS), mogą znajdować się w tym samym VPC lub w oddzielnym VPC niż proxy. Pamiętaj, że jeśli udało Ci się połączyć z dowolnymi instancjami RDS DB z poziomu tej samej lub oddzielnej sieci VPC, masz już wymagane zasoby sieciowe.

Jeśli dopiero zaczynasz korzystać z Amazon RDS dla SQL Server, możesz nauczyć się podstaw łączenia się z bazą danych, postępując zgodnie z instrukcjami konfiguracji środowiska w sekcji Utwórz i połącz się z bazą danych Microsoft SQL Server za pomocą Amazon RDS.

Możesz także utworzyć wiele punktów końcowych RDS Proxy, każdy z własnymi ustawieniami VPC, a następnie aktywować łączność między wieloma współdzielonymi VPC. Na przykład możesz utworzyć punkt końcowy proxy we współużytkowanym środowisku VPC, aby selektywnie przyznawać dostęp tylko swojemu serwerowi proxy, zamiast zezwalać na dostęp do wszystkich zasobów w ramach VPC serwera proxy. Aby dowiedzieć się więcej o punktach końcowych proxy, zobacz Using Amazon RDS Proxy Endpoints.

Bezpieczeństwo

Musisz przechowywać klucze tajnych baz danych w AWS Secrets Manager, który jest zaszyfrowanym magazynem sekretów. Za jego pomocą można zarządzać i pobierać poświadczenia bazy danych. Po prostu wykonujesz wywołanie API ze swojej aplikacji, aby pobrać tajne dane i rozpocząć połączenie. Kolejną dodatkową warstwą kontroli jest możliwość korzystania z uwierzytelniania IAM z serwerem proxy RDS. Jest znacznie bezpieczniejszy niż łączność z nazwą użytkownika i hasłem. Możesz zarządzać poświadczeniami, których Twoja aplikacja może używać na serwerze proxy, za pomocą Menedżera tajnych informacji. Możesz również usunąć zakodowane na stałe poświadczenia w kodzie, zastępując je wywołaniami pobierania tajnych informacji lub używając tokenu uwierzytelniania uprawnień.

Aby utworzyć serwer proxy za pomocą interfejsu wiersza poleceń AWS (AWS CLI), możesz użyć następujących poleceń:

// create a secret for user credential that you use on RDS instance

// One per each credential you intend to use with proxy

aws secretsmanager create-secret \

--name sqlserver-creds --description "db admin user" \

--secret-string '{"username":"master","password":"**********"}'

--region us-west-2

 

// create proxy role

aws iam create-role --role-name rds-proxy-role \

--assume-role-policy-document '{"Version":"2012-10-17","Statement":

[{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},

"Action":"sts:AssumeRole"}]}'

// add secrets reader policy to the role

aws iam put-role-policy --role-name rds-proxy-role \

--policy-name rds-proxy-secret-reader-policy --policy-document

'{"Version":"2012-10-17","Statement":[{"Sid":"getsecretvalue","Effect"

:"Allow","Action":["secretsmanager:GetSecretValue","kms:Decrypt"],

"Resource":"*"}]}'

 

// create proxy instance

aws rds create-db-proxy --db-proxy-name test-proxy --engine-family SQLSERVER \

--auth Description=master,AuthScheme=SECRETS,SecretArn=arn:<arn details>:<acc>:secret:sqlserver-creds-ConshD,IAMAuth=DISABLED \

--role-arn arn:aws:iam::<acc>:role/rds-proxy-role --vpc-subnet-ids subnet-XXXXX subnet-XXXXX subnet-XXXXX subnet-XXXXX --region us-west-2

 

// register rds instance

aws rds register-db-proxy-targets --db-proxy-name test-proxy

 --db-instance-identifiers test-instance

Utwórz serwer proxy z RDS dla SQL Server

Aby zarządzać połączeniami dla określonego zestawu instancji DB, możesz utworzyć proxy. Amazon RDS Proxy jest dostępny dla Amazon RDS dla SQL Server, Amazon Aurora z kompatybilnością z MySQL, Amazon Aurora z kompatybilnością z PostgreSQL, Amazon RDS dla MySQL, Amazon RDS dla MariaDB i Amazon RDS dla PostgreSQL. W tym miejscu autorzy skupiają się na obsłudze RDS Proxy dla RDS SQL Server.

  1. W konsoli Amazon RDS wybierz Proxy w okienku nawigacji.
  2. Wybierz Utwórz proxy.
  3. W przypadku konfiguracji serwera proxy podaj informacje dotyczące następujących ustawień:
    1. Identyfikator proxy – określ wybraną przez siebie nazwę, unikalną w ramach identyfikatora konta AWS i bieżącego regionu AWS.
    2. Zgodność silnika – wybierz program SQL Server.
    3. Wymagaj zabezpieczeń warstwy transportu – wybierz to ustawienie, jeśli chcesz, aby serwer proxy wymuszał TLS/SSL dla wszystkich połączeń klientów. W przypadku korzystania z zaszyfrowanego lub nieszyfrowanego połączenia z serwerem serwer proxy używa tego samego ustawienia szyfrowania podczas nawiązywania połączenia z podstawową bazą danych.
    4. Limit czasu bezczynnego połączenia klienta – wybierz czas, przez który połączenie klienta może być bezczynne, zanim serwer proxy może je zamknąć. Wartość domyślna to 1800 sekund (30 minut). Połączenie klienta jest uważane za bezczynne, gdy aplikacja nie prześle nowego żądania w określonym czasie po zakończeniu poprzedniego żądania. Podstawowe połączenie z bazą danych pozostaje otwarte i jest zwracane do puli połączeń. Dlatego można je ponownie wykorzystać do nowych połączeń klientów. Rozważ zmniejszenie limitu czasu bezczynnego połączenia klienta, jeśli chcesz, aby serwer proxy proaktywnie usuwał przestarzałe połączenia. Jeśli obciążenie wzrasta, rozważ zwiększenie limitu czasu bezczynnego połączenia klienta, aby zaoszczędzić na kosztach nawiązywania połączeń.
  4. W przypadku łączności podaj informacje dotyczące następujących elementów:
    1. Secrets Manager secrets – wybierz co najmniej jeden klucz tajny Secrets Manager, który zawiera poświadczenia użytkownika bazy danych dla wystąpienia bazy danych RDS, do której zamierzasz uzyskać dostęp za pomocą tego serwera proxy.
    2. IAM Role – wybierz IAM Role, która posiada uprawnienia dostępu do wybranych wcześniej wpisów tajnych Secrets Manager. Możesz również użyć konsoli zarządzania AWS, aby utworzyć nową rolę uprawnień.
    3. Uwierzytelnianie IAM – wybierz, czy zezwolić na uwierzytelnianie IAM dla połączeń z serwerem proxy, czy nie. Wybór uwierzytelniania uprawnień lub rodzimego uwierzytelniania bazy danych dotyczy wszystkich użytkowników bazy danych, którzy uzyskują dostęp do tego serwera proxy.
    4. Podsieci – to pole jest wstępnie wypełnione wszystkimi podsieciami powiązanymi z Twoją VPC. Możesz usunąć wszystkie podsieci, których nie potrzebujesz dla tego serwera proxy. Musisz opuścić co najmniej dwie podsieci.
  5. Zapewnij dodatkową konfigurację łączności:
    1. VPC security group – wybierz istniejącą grupę zabezpieczeń VPC. Możesz także użyć konsoli do utworzenia nowej grupy bezpieczeństwa. Ta grupa zabezpieczeń musi umożliwiać dostęp do bazy danych, z którą łączy się serwer proxy. Ta sama grupa zabezpieczeń jest używana do ruchu przychodzącego z aplikacji do serwera proxy i ruchu wychodzącego z serwera proxy do bazy danych. Załóżmy na przykład, że używasz tej samej grupy zabezpieczeń dla bazy danych i serwera proxy. W takim przypadku upewnij się, czy określono, że zasoby w tej grupie zabezpieczeń mogą komunikować się z innymi zasobami w tej samej grupie zabezpieczeń. Korzystając z udostępnionego środowiska VPC, nie możesz użyć domyślnej grupy zabezpieczeń dla VPC ani grupy, która należy do innego konta. Wybierz grupę zabezpieczeń, która należy do Twojego konta. Aby uzyskać więcej informacji na temat tego ograniczenia, zobacz Ograniczenia.
  6. Opcjonalnie podaj zaawansowaną konfigurację:
    1. Enable enhanced logging – możesz włączyć to ustawienie, aby rozwiązać problemy ze zgodnością lub wydajnością serwera proxy. Gdy to ustawienie jest włączone, serwer proxy RDS zawiera w swoich dziennikach szczegółowe informacje o instrukcjach SQL. Informacje te pomagają debugować problemy związane z zachowaniem SQL lub wydajnością i skalowalnością połączeń proxy. Informacje debugowania obejmują tekst instrukcji SQL przesyłanych za pośrednictwem serwera proxy. Dlatego włączaj to ustawienie tylko wtedy, gdy jest to konieczne do debugowania i tylko wtedy, gdy posiadasz środki bezpieczeństwa w celu ochrony wszelkich poufnych informacji pojawiających się w dziennikach. Aby zminimalizować obciążenie związane z serwerem proxy, RDS Proxy automatycznie wyłącza to ustawienie po 24 godzinach od jego włączenia. Włącz ją tymczasowo, aby rozwiązać konkretny problem.
  7. Wybierz Utwórz proxy.

Po utworzeniu serwera proxy masz dostęp do jego punktu końcowego DNS, aby połączyć swoją aplikację. RDS Proxy korzysta z domyślnego portu 1433 serwera SQL Server. Szczegóły punktu końcowego serwera proxy można pobrać w konsoli Amazon RDS na stronie szczegółów odpowiedniego serwera proxy lub za pomocą interfejsu AWS CLI za pomocą polecenia description-db-proxy. Zobacz następujący przykładowy kod:

# Add —output text to get output as a simple tab-separated list.

$ aws rds describe-db-proxies —query '*[*].{DBProxyName:DBProxyName,Endpoint:Endpoint}'

[

[

{

"Endpoint": "the-proxy.proxy-demo.us-east-1.rds.amazonaws.com",

"DBProxyName": "the-proxy"

},

{

"Endpoint": "the-proxy-other-secret.proxy-demo.us-east-1.rds.amazonaws.com",

"DBProxyName": "the-proxy-other-secret"

},

{

"Endpoint": "the-proxy-rds-secret.proxy-demo.us-east-1.rds.amazonaws.com",

"DBProxyName": "the-proxy-rds-secret"

},

{ "Endpoint": "the-proxy-t3.proxy-demo.us-east-1.rds.amazonaws.com",

"DBProxyName": "the-proxy-t3"

}

]

]

Połącz się z serwerem proxy RDS

 

Możesz skonfigurować tajne klucze programu Secrets Manager zawierające nazwy użytkowników i hasła oraz autoryzować serwer proxy RDS do pobierania poświadczeń z programu Secrets Manager. Uwierzytelnianie uprawnień dotyczy połączenia między programem klienckim a serwerem proxy. Serwer proxy uwierzytelnia się następnie w bazie danych przy użyciu poświadczeń nazwy użytkownika i hasła pobranych z Menedżera obiektów tajnych. W RDS Proxy można skonfigurować wiele wpisów tajnych; aby uzyskać więcej informacji, zobacz create-db-proxy.

W przypadku SQL Server musisz użyć odpowiedniej właściwości tokenu dla każdego sterownika: accessToken na JDBC, sql_copt_ss_access_token dla ODBC lub AccessToken dla .NET SqlClient. Inne narzędzia, które nie obsługują takich właściwości, nie będą mogły korzystać z metody uwierzytelniania IAM. W chwili, kiedy powstaje ten tekst, uwierzytelnianie AD nie jest obsługiwane.

Monitorowanie proxy RDS dla RDS SQL Server

Możesz monitorować RDS Proxy za pomocą Amazon CloudWatch. CloudWatch zbiera i przetwarza surowe dane z serwerów proxy w czytelne metryki w czasie zbliżonym do rzeczywistego. Aby znaleźć te metryki w konsoli CloudWatch, wybierz Metryki w okienku nawigacji, a następnie wybierz RDS i wybierz Metryki na serwer proxy. Aby uzyskać więcej informacji, zapoznaj się z „Korzystanie z metryk Amazon CloudWatch”.

Korzyści z RDS Proxy z RDS dla SQLServer

Porządkowanie środowiska

W kolejnych krokach musisz wyczyścić zasoby utworzone w tym samouczku.

  1. W konsoli Amazon RDS wybierz Proxy w okienku nawigacji.
  2. Wybierz serwer proxy i w menu Akcje wybierz Usuń.
  3. W oknie dialogowym wpisz usuń mnie i wybierz Usuń.
  4. Status proxy zmieni się na Usuwanie. Po zakończeniu serwer proxy jest usuwany z listy. Aby usunąć serwer proxy bazy danych za pomocą interfejsu AWS CLI, użyj polecenia delete-db-proxy. Aby usunąć powiązane powiązania, użyj komendy deregister-db-proxy-targets. Zobacz następujący kod:
  5. W konsoli Secrets Manager wybierz swój tajny klucz.
  6. W menu Czynności wybierz Usuń.
  7. Jeśli utworzono nową instancję EC2, instancję RDS i odpowiednie grupy zabezpieczeń dla tego samouczka, usuń również te zasoby.

Podsumowanie

RDS Proxy umożliwia aplikacjom łączenie i udostępnianie połączeń nawiązanych z bazą danych, poprawiając wydajność bazy danych i skalowalność aplikacji. RDS Proxy z RDS dla SQLServer skraca czas przełączania awaryjnego nawet o 36% w stosunku do połączenia z punktem końcowym odbiornika Always On i nawet o 59% w porównaniu z bezpośrednim połączeniem z punktem końcowym RDS. RDS Proxy skraca czas przełączania awaryjnego nawet o 83% podczas łączenia się z punktem końcowym dublowania bazy danych programu SQL Server. Ponadto serwer proxy RDS umożliwia korzystanie z uwierzytelniania uprawnień, dzięki czemu nie trzeba przechowywać poświadczeń w aplikacji, co zwiększa bezpieczeństwo aplikacji. Za pomocą tego tekstu autorzy w przejrzysty sposób zaprezentowali, jak skonfigurować RDS dla serwera proxy SQL Server i szczegółowo omówiliśmy te potencjalne korzyści.

Wypróbuj to rozwiązanie w swoim RDS dla wystąpienia SQL Server. Jeśli masz jakieś uwagi lub pytania, zostaw je w sekcji komentarzy.

 

Źródło: AWS

Case Studies
Referencje

Bardzo profesjonalne podejście, niesamowicie szybki czas reakcji i bardzo miła obsługa sprawiły, że na pewno podejmiemy jeszcze współpracę. 

Marcin Krzaczkowski
Założyciel Automa.Net
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.