Azure Portal을 사용하여 단일 데이터베이스를 만들려면:
SQL 배포 옵션 선택 페이지로 이동합니다.
SQL 데이터베이스에서 리소스 유형을 단일 데이터베이스로 설정한 상태로 두고 만들기를 선택합니다.
SQL Database 만들기 양식의 기본 탭에 있는 프로젝트 세부 정보 아래에서 사용하려는 Azure 구독을 선택합니다.
리소스 그룹의 경우 새로 만들기를 선택하고, myResourceGroup을 입력하고, 확인을 선택합니다.
데이터베이스 이름으로 demo를 입력합니다.
서버의 경우 새로 만들기를 선택합니다. 다음 값으로 새 서버 양식을 작성합니다.
- 서버 이름: mysqlserver를 입력하고 고유하게 유지하기 위한 일부 문자를 추가합니다. 서버 이름은 구독 내에서 고유한 것이 아니라 Azure의 모든 서버에 대해 전역적으로 고유해야 하므로 사용할 정확한 서버 이름을 제공할 수 없습니다. mysqlserver12345와 같은 항목을 입력하면 포털에서 사용 가능 여부를 알 수 있습니다.
- 서버 관리자 로그인: azureuser를 입력합니다.
- 암호: 요구 사항을 충족하는 암호를 입력합니다. 암호 확인 상자에 다시 입력합니다.
- 위치: 드롭다운 목록에서 위치를 선택합니다.
- Azure 서비스가 이 서버에 액세스하도록 허용: 다이제스트 스토리지에 대한 액세스를 활성화하려면 이 옵션을 선택합니다.
확인을 선택합니다.
SQL 탄력적 풀을 사용하나요? 를 아니요로 설정된 상태로 둡니다.
컴퓨팅 + 스토리지에서 데이터베이스 구성을 선택합니다.
이 빠른 시작에서는 서버리스 데이터베이스를 사용하므로 서버리스를 선택한 다음, 적용을 선택합니다.
네트워킹 탭에서 연결 방법에 대해 퍼블릭 엔드포인트를 선택합니다.
방화벽 규칙의 경우 현재 클라이언트 IP 주소 추가를 예로 설정합니다. Azure 서비스 및 리소스가 이 서버에 액세스할 수 있도록 허용을 아니요로 설정된 상태로 둡니다.
페이지 하단에서 다음: 보안을 선택합니다.
보안 탭의 원장 섹션에서 원장 구성 옵션을 선택합니다.
원장 구성 창의 원장 섹션에서 이 데이터베이스의 모든 향후 테이블에 사용 확인란을 선택합니다. 이 설정을 통해 데이터베이스의 향후 모든 테이블이 원장 테이블이 됩니다. 이러한 이유로 데이터베이스의 모든 데이터는 변조 증거를 표시합니다. 기본적으로 새 테이블은 CREATE TABLE에 LEDGER = ON
을 지정하지 않더라도 업데이트 가능한 원장 테이블로 만들어집니다. 이 옵션을 선택하지 않은 상태로 둘 수도 있습니다. 그런 다음, Transact-SQL을 사용하여 새 테이블을 만들 때 테이블별로 원장 기능을 사용하도록 설정해야 합니다.
Digest Storage 섹션에서 자동 다이제스트 스토리지 사용이 자동으로 선택됩니다. 그런 다음, 다이제스트가 저장된 새 Azure Storage 계정과 컨테이너가 생성됩니다.
적용을 선택합니다.
페이지 아래쪽에서 검토 + 만들기를 선택합니다.
검토 + 만들기 페이지에서 검토 후 만들기를 선택합니다.
Azure CLI를 사용하여 리소스 그룹, 논리 데이터베이스 서버, 단일 원장 데이터베이스를 만들고 원장 다이제스트 업로드를 구성합니다.
Azure Cloud Shell 시작
Azure Cloud Shell은 이 문서의 단계를 실행하는 데 무료로 사용할 수 있는 대화형 셸입니다. 공용 Azure 도구가 사전 설치되어 계정에서 사용하도록 구성되어 있습니다.
Cloud Shell을 열려면 코드 블록의 오른쪽 위 모서리에 있는 사용해 보세요를 선택합니다. 또한 https://shell.azure.com 로 이동하여 별도의 브라우저 탭에서 Cloud Shell을 시작할 수 있습니다. 복사를 선택하여 코드 블록을 복사하여 Cloud Shell에 붙여넣고, Enter 키를 눌러 실행합니다.
매개 변수 값 설정
다음 값은 데이터베이스와 필요한 리소스를 만드는 후속 명령에 사용됩니다. 서버 이름 및 스토리지 계정 이름은 모든 Azure에서 전역적으로 고유해야 하므로 $RANDOM 함수를 사용하여 서버 이름 및 스토리지 계정 이름을 만듭니다.
리소스 이름은 구독에서 고유해야 합니다. <your resource group name>
을 고유한 이름으로 바꾸고 <your subscription ID>
를 구독 ID로 바꿉니다.
IP 주소 범위의 0.0.0.0 값을 특정 환경에 맞게 바꿉니다.
westeurope를 기본 Azure 지역 이름으로 바꿉니다.
resourceGroupName="<your resource group name>"
location="westeurope"
serverName="mysqlserver"-$RANDOM
databaseName="myLedgerDatabase"
storageAccountName="mystorage"$RANDOM
subscription="<your subscription ID>"
adminLogin=azureuser
adminPassword=<password>
serverResourceId="/subscriptions/$subscription/resourceGroups/$resourceGroupName/providers/Microsoft.Sql/servers/$serverName"
# The ip address range that you want to allow to access your server
startIP=0.0.0.0
endIP=0.0.0.0
# Set variables for your digest storage location
storageAccountName="mystorage"$RANDOM
storageAccountURL1="https://"
storageAccountURL3=".blob.core.windows.net"
storageAccountURL=$storageAccountURL1$storageAccountName$storageAccountURL3
storageAccountResourceId="/subscriptions/$subscription/resourceGroups/$resourceGroupName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
# Show resource names
echo "Resource group name is" $resourceGroupName
echo "Server name is" $serverName
echo "Database name is" $databaseName
echo "Storage account name is" $storageAccountName
리소스 그룹 만들기
az group create 명령을 사용하여 리소스 그룹을 만듭니다. Azure 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.
az group create --name $resourceGroupName --location $location
관리 ID가 있는 서버 만들기
az sql server create 명령을 사용하여 서버를 만듭니다. 이 명령은 관리 ID가 할당된 서버를 만듭니다.
az sql server create \
--name $serverName \
--resource-group $resourceGroupName \
--location $location \
--admin-user $adminLogin \
--admin-password $adminPassword \
--assign-identity
이 명령은 나중에 원장 다이제스트를 업로드할 수 있는 서버 권한을 부여하는 데 사용되는 변수에 ID를 저장합니다.
# Retrieves the assigned identity to be used when granting the server access to the storage account
principalId=`az sql server show \
--name $serverName \
--resource-group $resourceGroupName \
--query identity.principalId \
--output tsv`
az sql server firewall-rule create 명령을 사용하여 방화벽 규칙을 만듭니다.
az sql server firewall-rule create \
--resource-group $resourceGroupName \
--server $serverName \
-n AllowYourIp \
--start-ip-address $startIP \
--end-ip-address $endIP
단일 원장 데이터베이스 만들기
az sql db create 명령을 사용하여 원장 데이터베이스를 만듭니다. 다음 명령은 원장 사용이 설정된 서버리스 데이터베이스를 만듭니다.
az sql db create \
--resource-group $resourceGroupName \
--server $serverName \
--name $databaseName \
--edition GeneralPurpose \
--family Gen5 \
--capacity 2 \
--compute-model Serverless \
--ledger-on
스토리지 계정 만들기
az storage account create 명령을 사용하여 원장 다이제스트를 저장할 스토리지 계정을 생성합니다.
az storage account create \
--name $storageAccountName \
--resource-group $resourceGroupName \
--location $location \
--sku Standard_GRS \
--kind StorageV2
원장 다이제스트를 작성할 수 있는 서버 권한 부여
az role assignment create 명령을 사용하여 서버의 관리 ID를 Storage Blob 데이터 기여자 역할에 할당합니다. 이렇게 하면 데이터베이스 다이제스트를 스토리지 계정에 게시할 수 있는 적절한 권한을 SQL 서버에 제공합니다.
az role assignment create \
--assignee-object-id $principalId \
--assignee-principal-type "ServicePrincipal" \
--role "Storage Blob Data Contributor" \
--scope $storageAccountResourceId
데이터베이스 다이제스트 업로드 사용
az sql db ledger-digest-uploads enable 명령을 사용하여 스토리지 계정에 원장 다이제스트 업로드를 시작하도록 데이터베이스를 업데이트합니다.
az sql db ledger-digest-uploads enable \
--name $databaseName \
--resource-group $resourceGroupName \
--server $serverName \
--endpoint $storageAccountURL
다이제스트를 삭제하거나 업데이트하지 못하도록 하려면 az storage container immutability-policy create 및 az storage container immutability-policy lock 명령을 사용하여 sqldbledgerdigests 컨테이너에 시간 기반 보존 정책을 구성하는 것이 좋습니다. 정책에서는 보호된 추가 Blob 쓰기를 허용해야 합니다. 이렇게 하면 지정된 불변성 기간 동안 다이제스트를 삭제 또는 업데이트할 수 없을 때 데이터베이스 서버가 새 다이제스트가 포함된 블록을 기존 Blob에 추가할 수 있습니다.
중요
아래 예제는 1일의 불변성 기간 값을 사용합니다. 프로덕션 환경에서는 훨씬 더 큰 값을 사용해야 합니다.
참고 사항
데이터베이스 다이제스트를 스토리지 계정으로 업로드하기 시작하면 불변성 정책이 만료될 때까지 스토리지 계정을 삭제할 수 없습니다. 이 빠른 시작 직후에 리소스를 정리할 계획인 경우에는 불변성 정책 설정을 건너뛸 수 있습니다.
컨테이너의 시간 기반 보존 정책에 대한 자세한 내용은 컨테이너에 대한 불변성 정책 구성을 참조하세요.
az storage container immutability-policy create \
--resource-group $resourceGroupName \
--account-name $storageAccountName \
--container-name sqldbledgerdigests \
--period 1 \
--allow-protected-append-writes true
# Retrieves the etag value of the policy to be used when the policy is locked
etag=`az storage container immutability-policy show \
--account-name $storageAccountName \
--container-name sqldbledgerdigests \
--query etag \
--output tsv`
etag="${etag/$'\r'/}"
az storage container immutability-policy lock \
--resource-group $resourceGroupName \
--account-name $storageAccountName \
--container-name sqldbledgerdigests \
--if-match $etag
Windows PowerShell을 사용하여 리소스 그룹, 논리 데이터베이스 서버, 단일 원장 데이터베이스를 만들고 원장 다이제스트 업로드를 구성합니다.
Azure Cloud Shell 시작
Azure Cloud Shell은 이 문서의 단계를 실행하는 데 무료로 사용할 수 있는 대화형 셸입니다. 공용 Azure 도구가 사전 설치되어 계정에서 사용하도록 구성되어 있습니다.
Cloud Shell을 열려면 코드 블록의 오른쪽 위 모서리에 있는 사용해 보세요를 선택합니다. 또한 https://shell.azure.com 로 이동하여 별도의 브라우저 탭에서 Cloud Shell을 시작할 수 있습니다. 복사를 선택하여 코드 블록을 복사하여 Cloud Shell에 붙여넣고, Enter 키를 눌러 실행합니다.
매개 변수 값 설정
다음 값은 데이터베이스와 필요한 리소스를 만드는 후속 명령에 사용됩니다. 서버 이름 및 스토리지 계정 이름은 모든 Azure에서 전역적으로 고유해야 하므로 Get-Random cmdlet을 사용하여 서버 이름 및 스토리지 계정 이름을 만듭니다.
리소스 이름은 구독에서 고유해야 합니다. <your resource group name>
을 고유한 이름으로 바꿉니다.
IP 주소 범위의 0.0.0.0 값을 특정 환경에 맞게 바꿉니다.
westeurope를 기본 Azure 지역 이름으로 바꿉니다.
# Set variables for your server and database
$resourceGroupName = "<your resource group name>"
$location = "westeurope"
$serverName = "mysqlserver-$(Get-Random)"
$databaseName = "myLedgerDatabase"
$storageAccountName = "mystorage$(Get-Random)"
# The ip address range that you want to allow to access your server
$startIP = "0.0.0.0"
$endIP = "0.0.0.0"
# Show resource names
Write-host "Resource group name is" $resourceGroupName
Write-host "Server name is" $serverName
Write-host "Storage account name is" $storageAccountName
리소스 그룹 만들기
New-AzResourceGroup을 사용하여 Azure 리소스 그룹을 만듭니다. 리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다.
Write-host "Creating resource group..."
$resourceGroup = New-AzResourceGroup `
-Name $resourceGroupName `
-Location $location
$resourceGroup
서버 만들기
New-AzSqlServer cmdlet을 사용하여 서버를 만듭니다.
cmdlet은 관리 ID가 할당된 서버를 만듭니다. 나중에 원장 다이제스트를 업로드할 수 있는 서버 권한을 부여해야 합니다.
메시지가 표시되면 SQL 관리자 사용자 이름과 암호를 입력합니다.
Write-host "Creating primary server..."
$server = New-AzSqlServer `
-ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-Location $location `
-AssignIdentity `
-SqlAdministratorCredentials (Get-Credential)
$server
방화벽 규칙을 만들기
New-AzSqlServerFirewallRule cmdlet을 사용하여 서버 방화벽 규칙을 만듭니다.
Write-host "Configuring server firewall rule..."
$serverFirewallRule = New-AzSqlServerFirewallRule -ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-FirewallRuleName "AllowedIPs" -StartIpAddress $startIP -EndIpAddress $endIP
$serverFirewallRule
단일 원장 데이터베이스 만들기
New-AzSqlDatabase cmdlet을 사용하여 단일 원장 데이터베이스를 만듭니다.
아래 예제에서는 서버리스 데이터베이스를 만듭니다.
Write-host "Creating a gen5 2 vCore serverless ledger database..."
$database = New-AzSqlDatabase -ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-DatabaseName $databaseName `
-Edition GeneralPurpose `
-ComputeModel Serverless `
-ComputeGeneration Gen5 `
-VCore 2 `
-MinimumCapacity 2 `
-EnableLedger
$database
스토리지 계정 만들기
New-AzStorageAccount cmdlet을 사용하여 원장 다이제스트를 저장할 스토리지 계정을 만듭니다.
Write-host "Creating a storage account for ledger digests..."
$storage = New-AzStorageAccount -ResourceGroupName $resourceGroupName `
-Name $storageAccountName `
-Location $location `
-SkuName Standard_RAGRS `
-Kind StorageV2 `
-AccessTier Hot
$storage
원장 다이제스트를 작성할 수 있는 서버 권한 부여
New-AzRoleAssignment cmdlet을 사용하여 서버의 관리 ID를 Storage Blob 데이터 기여자 역할에 할당합니다. 이렇게 하면 데이터베이스 다이제스트를 스토리지 계정에 게시할 수 있는 적절한 권한을 SQL 서버에 제공합니다.
Write-host "Granting the server access to the storage account..."
$assignment = New-AzRoleAssignment `
-ObjectId $server.Identity.PrincipalId `
-RoleDefinitionName "Storage Blob Data Contributor" `
-ResourceGroupName $resourceGroupName `
-ResourceType "Microsoft.Storage/storageAccounts" `
-ResourceName $storageAccountName
$assignment
데이터베이스 다이제스트 업로드 사용
Enable-AzSqlDatabaseLedgerDigestUpload cmdlet을 사용하여 스토리지 계정에 원장 다이제스트 업로드를 시작하도록 데이터베이스를 업데이트합니다. 데이터베이스 서버는 스토리지 계정 내에 sqldbledgerdigests라는 새 컨테이너를 만들고 컨테이너에 원장 다이제스트를 쓰기 시작합니다.
Write-host "Enabling ledger digest upload..."
$ledgerDigestUploadConfig = Enable-AzSqlDatabaseLedgerDigestUpload `
-ResourceGroupName $resourceGroupName `
-ServerName $serverName `
-DatabaseName $databaseName `
-Endpoint $storage.PrimaryEndpoints.Blob
$ledgerDigestUploadConfig
다이제스트를 삭제하거나 업데이트하지 못하도록 하려면 Set-AzRmStorageContainerImmutabilityPolicy 및 Lock-AzRmStorageContainerImmutabilityPolicy cmdlet을 사용하여 sqldbledgerdigests 컨테이너에 시간 기반 보존 정책을 구성하는 것이 좋습니다. 정책에서는 보호된 추가 Blob 쓰기를 허용해야 합니다. 이렇게 하면 지정된 불변성 기간 동안 다이제스트를 삭제 또는 업데이트할 수 없을 때 데이터베이스 서버가 새 다이제스트가 포함된 블록을 기존 Blob에 추가할 수 있습니다.
중요
아래 예제는 1일의 불변성 기간 값을 사용합니다. 프로덕션 환경에서는 훨씬 더 큰 값을 사용해야 합니다.
참고
지정된 불변성 기간 동안에는 컨테이너 또는 스토리지 계정을 삭제할 수 없습니다.
컨테이너의 시간 기반 보존 정책에 대한 자세한 내용은 컨테이너에 대한 불변성 정책 구성을 참조하세요.
Write-host "Configuring a time-based retention policy..."
$immutabilityPerdiod = 1
$containerName = "sqldbledgerdigests"
$policy = Set-AzRmStorageContainerImmutabilityPolicy `
-ResourceGroupName $resourceGroupName `
-StorageAccountName $storageAccountName `
-ContainerName $containerName `
-AllowProtectedAppendWrite $true `
-ImmutabilityPeriod $immutabilityPerdiod
Lock-AzRmStorageContainerImmutabilityPolicy `
-ResourceGroupName $resourceGroupName `
-StorageAccountName $storageAccountName `
-ContainerName $containerName `
-Etag $policy.Etag
다음 단계를 위해 리소스 그룹, 서버 및 단일 데이터베이스를 유지합니다. 다양한 방법으로 데이터베이스의 원장 기능을 사용하는 방법에 대해 알아봅니다.
이러한 리소스 사용을 완료한 경우 리소스 그룹을 삭제합니다. 이 작업을 수행하면 서버 및 서버 내의 단일 데이터베이스와 스토리지 계정도 삭제됩니다.