DXソリューション開発部の吉倉です。
みなさん、クラウドで環境構築してますか?
環境構築は、慣れだと思っています。
やったことないならまず1回やってみる。
1回やってみたなら、その環境を改めて1から作ってみつつ、「改善点が無いか?」と設定を見返したり、他に便利なサービスが出ていないか?を探したりする。
私はこの行為を「素振り」と呼んでますが、この素振りが勉強になったり、楽しかったりします。
知見を深めるために、Azureでも「素振り」をやろうということでブログを起こしました。
参考になれば幸いです。
今回のお題
クラウド上のDBサーバにSQLを発行する作業を自宅PCから実施したい。
DBサーバはパブリックIPを持っていないため、直接接続はできない。
仮想ネットワーク内にPublicIPを持っている踏み台サーバを作成し、踏み台サーバ経由でDBサーバに接続する。
踏み台サーバは普段は停止しており、必要な時のみ起動する。
AWSだとこうです。
こうすれば、クライアントからリモートデスクトップでEC2にログインし、
リモートデスクトップから、RDSに接続ができます。
「Systems Managerは?」って声が聞こえて来そうですが、今回は仮想マシンを立てた例の説明ということでご容赦くださいませ。
今回の環境
- Windows 10 Pro(21H1)
- Windows ターミナル 1.12.10983.0
- PowerShell 7.2.4
- Azure CLI 2.37.0
事前準備(今回は詳細割愛)
- Azure用のアカウント作成
- サブスクリプション作成
- Azure CLIのインストール
- Azureにログイン
作成するリソース
- リソースグループの作成
- 仮想ネットワーク(Virtual Network)の作成
- Network Security Groupの作成
- 踏み台サーバ(Virtual Machine)の作成
- SQL Database(サーバ・データベース)
- Private Linkの作成
リソースビジュアライザで見るとこうなります。
リソースグループ内に最終的に出来上がるものは以下のとおりです。
なお、SQL Databaseは仮想ネットワーク上にデプロイできないので、今回の構成を満たすには以下のような方法を採る必要があります。
- パブリック接続にして、接続可能なIPアドレス以外はファイアウォール規則でブロック
- 仮想ネットワークにプライベートエンドポイントを持たせて、仮想ネットワーク内のリソースからしかアクセスできない状態を作る
今回は2の方法を採用します。
リソースグループの作成
1 2 3 4 5 |
$cnt = '2' # ResouceGroup $rg_name = 'rg-for-blog' + $cnt $location = 'japaneast' az group create -n $rg_name -l $location |
仮想ネットワーク(Virtual Network)の作成
1 2 3 4 5 6 7 8 9 10 11 12 |
# VNet+Subnet $vnet_name = 'vnet-for-blog' + $cnt $vnet_cidr = '10.1.0.0/16' $subnet_name = 'subnet-for-blog' + $cnt $subnet_cidr = '10.1.0.0/24' az network vnet create ` -n $vnet_name ` -g $rg_name ` --address-prefixes $vnet_cidr ` --subnet-name $subnet_name ` --subnet-prefix $subnet_cidr |
実行後、こうなります。
Network Security Groupの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# NetworkSecurityGroup # ★IPアドレスは変更してください $myhome_public_ip = 'aaa.bbb.ccc.ddd/32' $nsg_name = 'nsg-for-blog' + $cnt $bastion_computer_name = 'hostname' $bastion_admin_username = 'testadmin' $bastion_admin_password = 'Password1234!' az network nsg create ` -n $nsg_name ` -g $rg_name az network nsg rule create ` -n SSH ` -g $rg_name ` --nsg-name $nsg_name ` --direction Inbound ` --priority 300 ` --source-address-prefixes $myhome_public_ip ` --source-port-ranges '*' ` --destination-address-prefixes '*' ` --destination-port-ranges 22 ` --access Allow ` --protocol Tcp ` --description "from my home" |
実行後、こうなります。
踏み台サーバ(Virtual Machine)の作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Virtual Machine $virtual_machine_name = 'vm-for-blog' + $cnt $virtual_machine_image = 'Canonical:UbuntuServer:18.04-LTS:latest' ## bastion VM az vm create ` -n $virtual_machine_name ` -g $rg_name ` -z 1 ` --vnet-name $vnet_name ` --subnet $subnet_name ` --size Standard_B1s ` --image $virtual_machine_image ` --computer-name $bastion_computer_name ` --admin-username $bastion_admin_username ` --admin-password $bastion_admin_password ` --nsg $nsg_name ` --enable-agent true ` --enable-auto-update true |
実行後、こうなります。
SQL Database(サーバ・データベース)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# SQL Database $dbserver_name = 'dbserver-for-blog' + $cnt $db_name = 'db-for-blog' + $cnt $sql_database_admin_username = 'hogefugadb' $sql_database_admin_password = 'Test12345678!' ## SQL Server az sql server create ` -n $dbserver_name ` -g $rg_name ` -u $sql_database_admin_username ` -p $sql_database_admin_password ` -e false ## SQL database az sql db create ` -n $db_name ` -g $rg_name ` -s $dbserver_name ` --edition Basic ` --read-scale Disabled ` --zone-redundant false |
実行後、こうなります。
Private Linkの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# Private Endpoint $private_endpoint_name = 'private-endpoint-for-blog' + $cnt $connection_name = 'connection-for-blog' + $cnt $private_dns_zone_name = 'privatelink.database.windows.net' $private_zone_group_name = 'zone-group-for-blog' + $cnt $private_zone_name = 'zone-for-blog' + $cnt $private_dns_link_name = 'private-dns-link-for-blog' + $cnt ## プライベート エンドポイントの作成 az network private-endpoint create ` -n $private_endpoint_name ` -g $rg_name ` --vnet-name $vnet_name ` --subnet $subnet_name ` --private-connection-resource-id $(az sql server show -n $dbserver_name -g $rg_name --query '[id]' --output tsv) ` --group-id sqlServer ` --connection-name $connection_name ## プライベート DNS ゾーンを作成 az network private-dns zone create ` -n $private_dns_zone_name ` -g $rg_name ## DNS ゾーンへの仮想ネットワーク リンクを作成 az network private-dns link vnet create ` -n $private_dns_link_name ` -g $rg_name ` -z $private_dns_zone_name ` -v $vnet_name ` -e false ## DNS ゾーン グループを作成 az network private-endpoint dns-zone-group create ` --endpoint-name $private_endpoint_name ` -n $private_zone_group_name ` -g $rg_name ` --private-dns-zone $private_dns_zone_name ` --zone-name $private_zone_name |
実行後、こうなります。
検証
では、踏み台に接続して、データベースに接続してみましょう。
踏み台にsshで接続の後、以下を実行。
nc -zv dbserver-for-blog2.database.windows.net 1433
接続確認OK
Connection to dbserver-for-blog2.database.windows.net 1433 port [tcp/ms-sql-s] succeeded!
プライベートIPで参照してるよね、ということの確認もしましょう。
nslookup dbserver-for-blog2.database.windows.net
結果。プライベートIPアドレスが返ってきます。
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
dbserver-for-blog2.database.windows.net canonical name = dbserver-for-blog2.privatelink.database.windows.net.
Name: dbserver-for-blog2.privatelink.database.windows.net
Address: 10.1.0.5
では、最後にSqlcmdで接続しましょう。(インストールは割愛)
sqlcmd -S tcp:dbserver-for-blog2.database.windows.net,1433 -U hogefugadb -d db-for-blog2
ログインして、SQLを発行。
1 2 |
select DB_NAME() go |
———————————————–
db-for-blog2
(1 rows affected)
SELECT文が発行できました!
おわりに
素振りも数をこなせば、自分のものになっていくかと思います。
「AWSならこうやるけど、Azureなら?」を一つずつ積み上げていきます。