<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Microsoft | きいちログ</title>
	<atom:link href="https://wptech.kiichiro.work/tag/microsoft/feed/" rel="self" type="application/rss+xml" />
	<link>https://wptech.kiichiro.work</link>
	<description>WordPressとかAWSとかPHPとか</description>
	<lastBuildDate>Wed, 22 Jan 2025 15:24:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Microsoft Certified: Azure Fundamentals (AZ-900) 合格までにやったことを振り返る</title>
		<link>https://wptech.kiichiro.work/16fmxdyyjh/</link>
		
		<dc:creator><![CDATA[むらおか]]></dc:creator>
		<pubDate>Wed, 22 Jan 2025 15:24:26 +0000</pubDate>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Microsoft]]></category>
		<guid isPermaLink="false">https://wptech.kiichiro.work/?p=3633</guid>

					<description><![CDATA[昨年から Azure を使うようになりました。 ある分野の知識を体系的に学んで身につけるには、資格取得へ向けて勉強するのが良いというのを身を以て知っているので、とりあえず基礎的な AZ-900 を受験してきました。 Mi [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>昨年から Azure を使うようになりました。</p>



<p>ある分野の知識を体系的に学んで身につけるには、資格取得へ向けて勉強するのが良いというのを身を以て知っているので、とりあえず基礎的な AZ-900 を受験してきました。</p>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp/credentials/certifications/azure-fundamentals/?practice-assessment-type=certification" title="Microsoft 認定: Azure Fundamentals - Certifications" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fcredentials%2Fcertifications%2Fazure-fundamentals%2F%3Fpractice-assessment-type%3Dcertification?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Microsoft 認定: Azure Fundamentals - Certifications</div><div class="blogcard-snippet external-blogcard-snippet">クラウドの概念、Azure のコア サービス、および Azure の管理とガバナンスの機能とツールに関する基本的な知識を示します。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp/credentials/certifications/azure-fundamentals/?practice-assessment-type=certification" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>難易度的には基礎レベルなので、おそらく AWS Certified Cloud Practitioner と同程度と思っています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">どのような勉強をしたか</a><ol><li><a href="#toc2" tabindex="0">公式</a><ol><li><a href="#toc3" tabindex="0">Microsoft Learn</a></li><li><a href="#toc4" tabindex="0">AWS プロフェッショナル向け Azure</a></li></ol></li><li><a href="#toc5" tabindex="0">テキスト</a><ol><li><a href="#toc6" tabindex="0">全体像と用語がよくわかる! Microsoft Azure入門ガイド</a></li></ol></li></ol></li><li><a href="#toc7" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">どのような勉強をしたか</span></h2>



<p>いつものように書籍を初手で購入したのですが、Microsoft に関連するものは公式の資料やトレーニング用コンテンツが豊富なので、それだけでも良かった気がします。</p>



<h3 class="wp-block-heading"><span id="toc2">公式</span></h3>



<h4 class="wp-block-heading"><span id="toc3">Microsoft Learn</span></h4>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp" title="Microsoft Learn: キャリアの扉を開くスキルを身につける" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Microsoft Learn: キャリアの扉を開くスキルを身につける</div><div class="blogcard-snippet external-blogcard-snippet">ドキュメントやトレーニングによる技術スキルを獲得し、資格を取得し、コミュニティとつながる</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>各認定試験ごとにコースが用意されているようで、今回は AZ-900 受験に向けたコースを受講しました。もちろん無料です。</p>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp/training/courses/az-900t00" title="AZ-900T00-A コース: クラウド インフラストラクチャの概要 - Training" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Ftraining%2Fcourses%2Faz-900t00?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">AZ-900T00-A コース: クラウド インフラストラクチャの概要 - Training</div><div class="blogcard-snippet external-blogcard-snippet">AZ-900T00-A コース: クラウド インフラストラクチャの概要</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp/training/courses/az-900t00" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>コースではサンドボックス内でのハンズオンが用意されています。手を動かしながら覚えられるのは地味に嬉しいですね。</p>



<h4 class="wp-block-heading"><span id="toc4">AWS プロフェッショナル向け Azure</span></h4>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp/azure/architecture/aws-professional" title="AWS プロフェッショナルのための Azure - Azure Architecture Center" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fazure%2Farchitecture%2Faws-professional?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">AWS プロフェッショナルのための Azure - Azure Architecture Center</div><div class="blogcard-snippet external-blogcard-snippet">Microsoft Azure プラットフォーム、アカウント、サービスの基本について説明します。 AWS プラットフォームと Azure プラットフォームの主な類似点と相違点について説明します。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp/azure/architecture/aws-professional" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>既に AWS を利用している人向けの資料です。これはかなり利用しました。よく知らない Azure のサービス名が出てきたら、まずはこのページを開くぐらいのことはやっていました。</p>



<h3 class="wp-block-heading"><span id="toc5">テキスト</span></h3>



<h4 class="wp-block-heading"><span id="toc6">全体像と用語がよくわかる! Microsoft Azure入門ガイド</span></h4>



<figure class="wp-block-embed aligncenter is-type-rich is-provider-amazon wp-block-embed-amazon"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="全体像と用語がよくわかる! Microsoft Azure入門ガイド" type="text/html" width="1320" height="550" frameborder="0" allowfullscreen style="max-width:100%" src="https://read.amazon.com.au/kp/card?preview=inline&#038;linkCode=kpd&#038;ref_=k4w_oembed_TK8nqcviMkeMiG&#038;asin=4863543689&#038;tag=kpembed-20"></iframe>
</div></figure>



<p>Azure についての知識が0からのスタートだったので、全体を薄く解説している本を用意しようと思っていました。これと「AWS プロフェッショナル向け Azure」を行き来しながら読むと良いと思います。</p>



<h2 class="wp-block-heading"><span id="toc7">まとめ</span></h2>



<p>今まで受験した AWS 認定と比較してもかなり易しかったと思います。クラウドの基礎についての理解と Azure のメインのサービスを触ったことがあれば比較的簡単に合格できそうです。勉強時間はトータルで10時間程度だったと思います。</p>



<p>公式のコンテンツは AWS よりも日本語訳が進んでいるようですが、訳し方にムラがあるように思えます。「Azure Fundamentals」と「Azure の基礎」はどちらかに統一してもらいたかった。。</p>



<p>次も何か受けてみようと思います。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Azure】Microsoft Entra IDで認可してBlob Storageを操作してみた</title>
		<link>https://wptech.kiichiro.work/14rqfd1ec6/</link>
		
		<dc:creator><![CDATA[むらおか]]></dc:creator>
		<pubDate>Wed, 15 Jan 2025 16:39:45 +0000</pubDate>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[React]]></category>
		<category><![CDATA[Remix]]></category>
		<guid isPermaLink="false">https://wptech.kiichiro.work/?p=3530</guid>

					<description><![CDATA[Azure Functions などのコンピュートリソースを用意しないで、直接 Blob Storage にファイルをアップロードする方法は無いものか、と考えていたのですが、Microsoft Entra ID で認可で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Azure Functions などのコンピュートリソースを用意しないで、直接 Blob Storage にファイルをアップロードする方法は無いものか、と考えていたのですが、Microsoft Entra ID で認可できればいいみたいでした。</p>



<p>別解として SAS トークンを利用した認可もありますが、どうやら Entra ID が推奨みたいです。</p>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-javascript-get-started?tabs=typescript%2Cazure-ad#authorize-access-and-connect-to-blob-storage" title="Azure Blob Storage と JavaScript または TypeScript の概要 - Azure Storage" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fazure%2Fstorage%2Fblobs%2Fstorage-blob-javascript-get-started%3Ftabs%3Dtypescript%252Cazure-ad%23authorize-access-and-connect-to-blob-storage?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Azure Blob Storage と JavaScript または TypeScript の概要 - Azure Storage</div><div class="blogcard-snippet external-blogcard-snippet">Azure Blob Storage で動作する JavaScript または TypeScript アプリケーションの開発を開始します。 この記事では、プロジェクトを設定し、Azure Blob Storage エンドポイントへのアクセス...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp/azure/storage/blobs/storage-blob-javascript-get-started?tabs=typescript%2Cazure-ad#authorize-access-and-connect-to-blob-storage" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>というわけで、今回は Microsoft Entra ID で認可して Blob Storage にファイルをアップロードするところまでやってみます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>本記事紹介している方法は、Microsoft Entra ID やストレージアカウントの RBAC の設定が甘いと思われます。本番環境で利用する場合は十分なレビューが必要です。</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">構成</a></li><li><a href="#toc2" tabindex="0">Microsoft Entra 管理センター</a></li><li><a href="#toc3" tabindex="0">ストレージアカウント</a><ol><li><a href="#toc4" tabindex="0">Remix アプリ</a><ol><li><a href="#toc5" tabindex="0">ライブラリ</a></li><li><a href="#toc6" tabindex="0">環境変数</a></li><li><a href="#toc7" tabindex="0">認証・認可</a></li></ol></li></ol></li><li><a href="#toc8" tabindex="0">動作確認</a></li><li><a href="#toc9" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">構成</span></h2>



<p>Microsoft Entra ID での認証自体は Remix で作った Web アプリを経由させ、Blob Storage へのアップロードはブラウザから直接行うようにします。登場人物をまとめた図は以下です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="402" height="452" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/blob-upload.png" alt="ブラウザからMicrosoft Entra IDで認証してBlob Storageにファイルをアップロードするまでの構成図" class="wp-image-3540" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/blob-upload.png 402w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/blob-upload-267x300.png 267w" sizes="(max-width: 402px) 100vw, 402px" /></figure>



<h2 class="wp-block-heading"><span id="toc2">Microsoft Entra 管理センター</span></h2>



<p>Microsoft Entra 管理センターにて、アプリの登録を行います。アプリの登録ではアプリを一意に示す ID とアプリ自体の認証情報を作成します。</p>



<p>手順は以下を参考に。</p>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp/entra/identity-platform/quickstart-web-app-nodejs-sign-in" title="クイック スタート - サンプル Web アプリでユーザーをサインインする - Microsoft identity platform" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fentra%2Fidentity-platform%2Fquickstart-web-app-nodejs-sign-in?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">クイック スタート - サンプル Web アプリでユーザーをサインインする - Microsoft identity platform</div><div class="blogcard-snippet external-blogcard-snippet">従業員テナントの従業員または外部テナントの顧客をサインインさせるサンプル Web アプリを構成する方法を示す Web アプリのクイック スタート</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp/entra/identity-platform/quickstart-web-app-nodejs-sign-in" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>アプリの登録が完了すると、概要ペインからクライアント ID とテナント ID を取得できます。</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="302" data-id="3552" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/93bccbc237574d85974089b4572968f8-1024x302.png" alt="クライアントIDとテナントID" class="wp-image-3552" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/93bccbc237574d85974089b4572968f8-1024x302.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/93bccbc237574d85974089b4572968f8-300x88.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/93bccbc237574d85974089b4572968f8-768x227.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/93bccbc237574d85974089b4572968f8-1536x453.png 1536w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/93bccbc237574d85974089b4572968f8-2048x604.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>今回は Web アプリ (機密クライアント) を選択したので、クライアントシークレットを生成します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="209" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/d9b8ab378c3c7b947e88bb30c75b8b13-1024x209.png" alt="" class="wp-image-3557" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/d9b8ab378c3c7b947e88bb30c75b8b13-1024x209.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/d9b8ab378c3c7b947e88bb30c75b8b13-300x61.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/d9b8ab378c3c7b947e88bb30c75b8b13-768x157.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/d9b8ab378c3c7b947e88bb30c75b8b13-1536x314.png 1536w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/d9b8ab378c3c7b947e88bb30c75b8b13-2048x418.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>




<a rel="noopener" href="https://learn.microsoft.com/ja-jp/entra/identity-platform/msal-client-applications" title="パブリックおよび機密のクライアント アプリ (MSAL) - Microsoft identity platform" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Flearn.microsoft.com%2Fja-jp%2Fentra%2Fidentity-platform%2Fmsal-client-applications?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">パブリックおよび機密のクライアント アプリ (MSAL) - Microsoft identity platform</div><div class="blogcard-snippet external-blogcard-snippet">Microsoft Authentication Library (MSAL) でのパブリック クライアント アプリケーションと機密クライアント アプリケーションについて説明します。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://learn.microsoft.com/ja-jp/entra/identity-platform/msal-client-applications" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a>



<p>ログイン正常完了時にトークンを送る先をリダイレクト URI として追加します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="398" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/cfdf6cc48710ac1722fe7cf50ae401fe-1024x398.png" alt="" class="wp-image-3553" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/cfdf6cc48710ac1722fe7cf50ae401fe-1024x398.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/cfdf6cc48710ac1722fe7cf50ae401fe-300x117.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/cfdf6cc48710ac1722fe7cf50ae401fe-768x299.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/cfdf6cc48710ac1722fe7cf50ae401fe-1536x598.png 1536w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/cfdf6cc48710ac1722fe7cf50ae401fe-2048x797.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="toc3">ストレージアカウント</span></h2>



<p>Microsoft Entra ID で認証されたユーザーに Blob Storage の操作を許可します。これを実現するには、ロールベースのアクセス制御である Azure RBAC を利用します。</p>



<p>まずは Azure portal から任意のストレージアカウントとコンテナーを作成します。作成できたら、アクセス制御 (IAM) ペインから 追加タブ > ロールの割り当ての追加 を選択します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="461" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/696c2c36a841fe44d5a74a6bdf46fff7-1024x461.png" alt="ロールの割り当ての追加" class="wp-image-3571" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/696c2c36a841fe44d5a74a6bdf46fff7-1024x461.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/696c2c36a841fe44d5a74a6bdf46fff7-300x135.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/696c2c36a841fe44d5a74a6bdf46fff7-768x346.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/696c2c36a841fe44d5a74a6bdf46fff7-1536x692.png 1536w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/696c2c36a841fe44d5a74a6bdf46fff7-2048x923.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>データ共同作業者を選択して次へを選択します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="430" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/331b7821a9217c0959e15fe949e8a734-1024x430.png" alt="" class="wp-image-3573" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/331b7821a9217c0959e15fe949e8a734-1024x430.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/331b7821a9217c0959e15fe949e8a734-300x126.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/331b7821a9217c0959e15fe949e8a734-768x323.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/331b7821a9217c0959e15fe949e8a734-1536x645.png 1536w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/331b7821a9217c0959e15fe949e8a734-2048x860.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>許可するユーザーを追加してレビューと割り当てを選択します。</p>



<h3 class="wp-block-heading"><span id="toc4">Remix アプリ</span></h3>



<p>Remix で作ったものは GitHub にアップしてます。</p>




<a rel="noopener" href="https://github.com/ShotaroMuraoka/azure-entra-auth-blob-storage" title="GitHub - ShotaroMuraoka/azure-entra-auth-blob-storage: Azure Blob Storage へのアクセスを Microsoft Entra ID で認可するアプリ" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fgithub.com%2FShotaroMuraoka%2Fazure-entra-auth-blob-storage?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - ShotaroMuraoka/azure-entra-auth-blob-storage: Azure Blob Storage へのアクセスを Microsoft Entra ID で認可するアプリ</div><div class="blogcard-snippet external-blogcard-snippet">Azure Blob Storage へのアクセスを Microsoft Entra ID で認可するアプリ - ShotaroMuraoka/azure-entra-auth-blob-storage</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/ShotaroMuraoka/azure-entra-auth-blob-storage" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p>以降はポイントのみを説明していきます。</p>



<h4 class="wp-block-heading"><span id="toc5">ライブラリ</span></h4>



<p>Remix で Microsoft Entra ID を使った認証と Blob Storage の操作を行うのに以下のライブラリを利用しています。</p>



<ul class="wp-block-list">
<li>remix-auth: 3.7.0</li>



<li>remix-auth-microsoft: 2.0.1</li>



<li>remix-auth-oauth2: 1.11.0</li>



<li>@azure-storage-blob: 12.26.0</li>
</ul>



<h4 class="wp-block-heading"><span id="toc6">環境変数</span></h4>



<p><code>.env</code> を作成し、取得した ID とクライアントシークレット、ストレージアカウント名などを記載します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file=".env"><code>ENTRA_CLIENT_ID={クライアントID}
ENTRA_CLIENT_SECRET={クライアントシークレット}
ENTRA_REDIRECT_URI=http://localhost:5173/auth/microsoft/callback
ENTRA_TENANT_ID={テナントID}
AZURE_STORAGE_ACCCOUNT={ストレージアカウント名}
AZURE_BLOB_CONTAINER={コンテナー名}</code></pre></div>



<h4 class="wp-block-heading"><span id="toc7">認証・認可</span></h4>



<p><code>remix-auth-microsoft</code> では MicrosoftStrategy が用意されているので、それを利用した Authenticator を作っています。</p>



<p>ここでは、scope に Azure Storage のアクセストークンの要求を追加しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-file="app/services/auth.server.ts" data-lang="TypeScript" data-line="11"><code>let microsoftStrategy = new MicrosoftStrategy(
  {
    clientId: process.env.ENTRA_CLIENT_ID || &quot;&quot;,
    clientSecret: process.env.ENTRA_CLIENT_SECRET || &quot;&quot;,
    redirectUri: process.env.ENTRA_REDIRECT_URI || &quot;&quot;,
    tenantId: process.env.ENTRA_TENANT_ID || &quot;&quot;,
    scope: [
      &quot;openid&quot;,
      &quot;email&quot;,
      &quot;profile&quot;,
      &quot;https://storage.azure.com/user_impersonation&quot;,
    ], // optional
    prompt: &quot;login&quot;, // optional
  },</code></pre></div>



<p>取得したアクセストークンはセッション情報に書き出されるので、loader でフロントエンドに渡しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-file="app/routes/dashboard.tsx" data-lang="TypeScript" data-line="7"><code>export async function loader({ request }: LoaderFunctionArgs) {
  const user = await authenticator.isAuthenticated(request);
  if (!user) {
    throw new Response(&quot;Unauthorized&quot;, { status: 403 });
  }

  const accessToken = user.accessToken;
  const storageAccount = process.env.AZURE_STORAGE_ACCCOUNT;
  const blobContainer = process.env.AZURE_BLOB_CONTAINER
  return { accessToken, storageAccount, blobContainer };
}
</code></pre></div>



<p>アクセストークンは <code>@azure-storage-blob</code> が提供するクライアントの生成に利用しています。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-ts" data-file="app/routes/dashboard.tsx" data-lang="TypeScript" data-line="2"><code>const blobServiceClient = createBlobServiceClient(
  accessToken,
  storageAccount,
);

const containerClient = blobServiceClient.getContainerClient(blobContainer);
const blockBlobClient = containerClient.getBlockBlobClient(file.name);

try {
  const response = await blockBlobClient.uploadBrowserData(file, {
    blobHTTPHeaders: { blobContentType: file.type },
  });
  console.log(&quot;upload succeeded&quot;, response.requestId);
  alert(&quot;ファイルアップロード完了&quot;);
} catch (error) {
  console.error(&quot;upload failed&quot;, error);
  alert(&quot;ファイルアップロード失敗&quot;);
}</code></pre></div>



<h2 class="wp-block-heading"><span id="toc8">動作確認</span></h2>



<p>アプリを起動します。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># npm run dev </code></pre></div>



<p>ブラウザで <code>http://localhost:5173/login</code> にアクセスします。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="437" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/4ac2c4d89027686851bc700e533bd679-1024x437.png" alt="" class="wp-image-3610" style="width:499px;height:auto" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/4ac2c4d89027686851bc700e533bd679-1024x437.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/4ac2c4d89027686851bc700e533bd679-300x128.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/4ac2c4d89027686851bc700e533bd679-768x327.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/4ac2c4d89027686851bc700e533bd679.png 1032w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>ログインボタンを押下すると、Microsoft のサインイン画面にリダイレクトされます。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="976" height="742" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/a210c4a89a86a2f1249080781e3bd2c1.png" alt="" class="wp-image-3612" style="width:422px;height:auto" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/a210c4a89a86a2f1249080781e3bd2c1.png 976w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/a210c4a89a86a2f1249080781e3bd2c1-300x228.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/a210c4a89a86a2f1249080781e3bd2c1-768x584.png 768w" sizes="(max-width: 976px) 100vw, 976px" /></figure>



<p>ストレージアカウントで許可したユーザーの認証情報を入力してログインに成功すると、ダッシュボード画面にリダイレクトします。初回ログイン時にのみ、Azure Storage へのアクセス許可を聞かれます。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="641" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/7963341bc5a5350c17c2cf5915d87052-1024x641.png" alt="" class="wp-image-3614" style="width:486px;height:auto" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/7963341bc5a5350c17c2cf5915d87052-1024x641.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/7963341bc5a5350c17c2cf5915d87052-300x188.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/7963341bc5a5350c17c2cf5915d87052-768x481.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/7963341bc5a5350c17c2cf5915d87052.png 1138w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>任意のファイルを選択して Upload ボタンを押下します。ファイルのアップロードが成功するとメッセージが表示されます。</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1012" height="510" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/c52d0320f5e473f648f6bec45c03dcd3.png" alt="" class="wp-image-3617" style="width:484px;height:auto" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/c52d0320f5e473f648f6bec45c03dcd3.png 1012w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/c52d0320f5e473f648f6bec45c03dcd3-300x151.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/c52d0320f5e473f648f6bec45c03dcd3-768x387.png 768w" sizes="(max-width: 1012px) 100vw, 1012px" /></figure>



<p>Blob コンテナーを見てみると、ファイルがアップロードされていることが確認できます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="353" src="https://wptech.kiichiro.work/wp-content/uploads/2025/01/68f3872b98c096bfebd9e36277eccf5c-1024x353.png" alt="" class="wp-image-3619" srcset="https://wptech.kiichiro.work/wp-content/uploads/2025/01/68f3872b98c096bfebd9e36277eccf5c-1024x353.png 1024w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/68f3872b98c096bfebd9e36277eccf5c-300x103.png 300w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/68f3872b98c096bfebd9e36277eccf5c-768x264.png 768w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/68f3872b98c096bfebd9e36277eccf5c-1536x529.png 1536w, https://wptech.kiichiro.work/wp-content/uploads/2025/01/68f3872b98c096bfebd9e36277eccf5c.png 1766w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="toc9">おわりに</span></h2>



<p>普段、Azure や Entra ID を利用する機会が無いので、難易度が高かったです。次は SAS トークンを試してみようと思います。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
