ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

京都の桜、いと美し

桜が見ごろを迎えていた京都に行ってきました。奈良にも足を延ばし、福井と金沢にも寄り道してきました。
ばえる写真がたくさん撮れたので、文字少なめでお届けしたいと思います。

京都

鹿苑寺(金閣寺)

f:id:TonyTonyKun:20210408195455j:plain
f:id:TonyTonyKun:20210408195604j:plain

鴨川

f:id:TonyTonyKun:20210408195656j:plain
f:id:TonyTonyKun:20210408195723j:plain
f:id:TonyTonyKun:20210408195809j:plain

円山公園

f:id:TonyTonyKun:20210408195835j:plain
f:id:TonyTonyKun:20210408195943j:plain
f:id:TonyTonyKun:20210408200024j:plain
f:id:TonyTonyKun:20210408200057j:plain

高台寺

f:id:TonyTonyKun:20210408200128j:plain
f:id:TonyTonyKun:20210408200227j:plain
f:id:TonyTonyKun:20210408200249j:plain

哲学の道

f:id:TonyTonyKun:20210408200403j:plain
f:id:TonyTonyKun:20210408200427j:plain
f:id:TonyTonyKun:20210408200339j:plain
f:id:TonyTonyKun:20210408200447j:plain
f:id:TonyTonyKun:20210408200508j:plain

南禅寺

f:id:TonyTonyKun:20210408200602j:plain
f:id:TonyTonyKun:20210408200625j:plain
f:id:TonyTonyKun:20210408200728j:plain

蹴上インクライン

f:id:TonyTonyKun:20210408200751j:plain
f:id:TonyTonyKun:20210408200811j:plain

清水寺

f:id:TonyTonyKun:20210408200855j:plain
f:id:TonyTonyKun:20210408200917j:plain
f:id:TonyTonyKun:20210408200958j:plain
f:id:TonyTonyKun:20210408201056j:plain
f:id:TonyTonyKun:20210408201119j:plain
f:id:TonyTonyKun:20210408201205j:plain
f:id:TonyTonyKun:20210408201231j:plain
f:id:TonyTonyKun:20210408201332j:plain
f:id:TonyTonyKun:20210408201417j:plain

二寧坂・産寧坂

f:id:TonyTonyKun:20210408201518j:plain
f:id:TonyTonyKun:20210408201541j:plain

嵐山

f:id:TonyTonyKun:20210408202622j:plain
f:id:TonyTonyKun:20210408202643j:plain
f:id:TonyTonyKun:20210408202703j:plain

奈良

東大寺

f:id:TonyTonyKun:20210408201614j:plain
f:id:TonyTonyKun:20210408201657j:plain
f:id:TonyTonyKun:20210408201742j:plain
f:id:TonyTonyKun:20210408201809j:plain
f:id:TonyTonyKun:20210408201835j:plain
f:id:TonyTonyKun:20210408201859j:plain
f:id:TonyTonyKun:20210408201939j:plain
f:id:TonyTonyKun:20210408202011j:plain

福井

福井駅

f:id:TonyTonyKun:20210408202739j:plain
f:id:TonyTonyKun:20210408202758j:plain

恐竜博物館

f:id:TonyTonyKun:20210408202842j:plain
f:id:TonyTonyKun:20210408202926j:plain
f:id:TonyTonyKun:20210408202947j:plain
f:id:TonyTonyKun:20210408203009j:plain
f:id:TonyTonyKun:20210408203049j:plain
f:id:TonyTonyKun:20210408203109j:plain

東尋坊

f:id:TonyTonyKun:20210408203130j:plain
f:id:TonyTonyKun:20210408203148j:plain
f:id:TonyTonyKun:20210408203207j:plain
f:id:TonyTonyKun:20210408203230j:plain

金沢

兼六園

f:id:TonyTonyKun:20210408203320j:plain
f:id:TonyTonyKun:20210408203342j:plain
f:id:TonyTonyKun:20210408203424j:plain
f:id:TonyTonyKun:20210408203518j:plain
f:id:TonyTonyKun:20210408203548j:plain
f:id:TonyTonyKun:20210408204314j:plain
f:id:TonyTonyKun:20210408204336j:plain

金沢城

f:id:TonyTonyKun:20210408204411j:plain
f:id:TonyTonyKun:20210408204430j:plain
f:id:TonyTonyKun:20210408204452j:plain
f:id:TonyTonyKun:20210408204512j:plain
f:id:TonyTonyKun:20210408204533j:plain

おまけ

京都、福井、金沢で食べた美味しいもの

f:id:TonyTonyKun:20210408202359j:plain
三嶋亭本店のすき焼き
f:id:TonyTonyKun:20210408202423j:plain
スプリングバレーブルワリー京都
f:id:TonyTonyKun:20210408202452j:plain
天下一品 総本店の牛すじラーメン
f:id:TonyTonyKun:20210408205015j:plain
新福菜館 本店の中華そば
f:id:TonyTonyKun:20210408205107j:plain
抹茶ビール
f:id:TonyTonyKun:20210408205229j:plain
福寿しの地物にぎり
f:id:TonyTonyKun:20210408205251j:plain
東尋坊のイカ焼き
f:id:TonyTonyKun:20210408205325j:plain
近江町市場の金沢丼
f:id:TonyTonyKun:20210408205348j:plain
8番らーめんの野菜らーめん

クラウドデベロッパーちゃんねるで Azure Kubernetes Service の話をしてきました

クラウドデベロッパーちゃんねるで、ちょまどさんと「Azure Kubernetes Service を活用したマイクロサービス開発のベストプラクティス」 というタイトルでお話してきました。

www.youtube.com

昨年の Advent Calendar で書いた記事の内容を解説している動画です。

gooner.hateblo.jp

当初は20分くらいでまとめる予定でしたが、いざ始めてみると30分くらい話してしまいました。ちょまどさんとの掛け合いというか相槌のタイミングは、オンラインだと難しいなと感じました。このあたりは慣れかもしれませんが、これからもオンラインの登壇は続くと思うので上手いやり方を探していきたいです。

なお、セッションで使ったスライドは、こちらで公開しています。

speakerdeck.com

ユーザー委任 SAS を使った AzCopy で Azure Blob Storage にファイルをアップロードする

Shared Access Signature(SAS)を使うと、Azure Storage へのアクセス許可を細かく制御できます。しかし、SAS が漏洩すると誰でも Azure Storage にアクセスできてしまう潜在的なリスクがあります。
ユーザー委任 SAS を使うことで、SAS が Azure AD で保護され、コードで SAS を管理する必要がなくなり、漏洩リスクを軽減できます。
docs.microsoft.com

ユースケース

売上分析プラットフォームにおいて、各店舗の POS システムから売上データを収集し、全店舗のデータをまとめた横断的な売上分析を行うシナリオを想定します。
Ingest Layer の Blob Storage に対して、各店舗から売上データ XML ファイルをセキュアにアップロードできるようにします。
gooner.hateblo.jp

RBAC のカスタムロールを作成する

組み込みの Storage Blob Data Contributor では必要以上の権限を与えてしまうので、SAS を生成して Blob Storage にファイルをアップロードのみできるカスタムロール azcopy-role を作成します。

{
  "Name": "azcopy-role",
  "IsCustom": true,
  "Description": "",
  "Actions": [
    "Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey/action"
  ],
  "NotActions": [

  ],
  "DataActions": [
    "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write",
    "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action"
  ],
  "AssignableScopes": [
    "/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>"
  ]
}

Azure Portal でも Storage Blob Data Contributor など組み込みの RBAC を Clone してカスタムロールを作れますが、ここでは Azure CLI を使います。

$ az role definition create --role-definition azcopy-role.json

カスタムロールにサービスプリンシパルを割り当てる

まずは、Azure Portal の Active Directory で App registrations からサービスプリンシパルを作成しておきます。今回は azcopy-user を作成しました。

$ az ad sp list --display-name "azcopy-user" --query "[].{appId:appId}"
[
  {
    "appId": "53c3cd6f-861e-44de-b15a-e1cf2cc5a332"
  }
]

RBAC には、リソース、リソース グループ、サブスクリプション、管理グループという 4 つのレベルのスコープがあります。必要最低限のアクセス権を付与したいので、ストレージのリソースに対してカスタムロールを割り当てます。

$ az role assignment create --assignee "53c3cd6f-861e-44de-b15a-e1cf2cc5a332" --role "azcopy-role" --scope "/subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>"

ユーザー委任 SAS を生成する

ここからは、各店舗側の POS システムで行う作業になります。あらかじめ、サービスプリンシパルのシークレットを作成しておきましょう。
Azure CLI を使って、サービスプリンシパルでログインします。

$ az login --service-principal --username 53c3cd6f-861e-44de-b15a-e1cf2cc5a332 --password <シークレット> --tenant <テナントID>

az storage container generate-sas コマンドを使って、ユーザー委任 SAS を生成します。指定されたIPアドレスから特定のコンテナへの書き込みのみが許可された SAS が返されます。

$ az storage container generate-sas --account-name <ストレージアカウント名> -n store-a --https-only --permissions c --expiry 2021-03-07T00:00:00Z --ip "176.134.171.0-176.134.171.255" --auth-mode login --as-user

AzCopy でファイルをアップロードする

先ほど生成した SAS を使って、AzCopy で Blob Storage に XML ファイルをアップロードします。
%date:~0,4%/%date:~5,2%/%date:~8,2% は、アップロードを実行した日付のパスにアップロードするための指定です。

$ azcopy cp "*.xml" "https://gooner0102.blob.core.windows.net/store-a/sales/%date:~0,4%/%date:~5,2%/%date:~8,2%?<SAS>"

Blob Storage を確認すると、XML ファイルをアップロードできたことがわかります。

f:id:TonyTonyKun:20210306120738p:plain

この SAS を使って Blob の一覧を取得しようとしても、403 エラーが返されます。

$ azcopy list "https://gooner0102.blob.core.windows.net/store-a/sales/%date:~0,4%/%date:~5,2%/%date:~8,2%?<SAS>"
RESPONSE Status: 403 This request is not authorized to perform this operation using this permission.

ユーザー委任 SAS を取り消す

この SAS が漏洩したことを想定し、az storage account revoke-delegation-keys コマンドを使って、ユーザー委任 SAS を取り消します。

$ az storage account revoke-delegation-keys --ids /subscriptions/<サブスクリプションID>/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>

AzCopy でファイルをアップロードしようとしても、403 エラーが返されます。

$ azcopy cp "*.xml" "https://gooner0102.blob.core.windows.net/store-a/sales/%date:~0,4%/%date:~5,2%/%date:~8,2%?<SAS>"
RESPONSE Status: 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.

まとめ

ユーザー委任 SAS を使って AzCopy で Azure Blob Storage にファイルをアップロードしました。
SAS を使う場合、RBAC のカスタムロールで要件に応じた必要最低限のアクセス権を付与できるので、可能な限りユーザー委任 SAS を使うことを検討しましょう。