tag:crieit.net,2005:https://crieit.net/users/ao-iro/feed ao-iroの投稿 - Crieit Crieitでユーザーao-iroによる最近の投稿 2023-03-25T17:59:53+09:00 https://crieit.net/users/ao-iro/feed tag:crieit.net,2005:PublicArticle/18415 2023-03-25T17:59:38+09:00 2023-03-25T17:59:53+09:00 https://crieit.net/posts/Arch-Linux-WSL2-azure-cli Arch Linux(WSL2)にazure-cliをインストール <p>Arch Linuxに(WSL2)にazure-cliをインストールした際の備忘録。</p> <p><strong>1.必要なパッケージのインストール</strong><br />  下記に記載のあったパッケージをインストール。<br />  Python 3.10.10<br />  libffi (何かの依存関係でインストールされていた)<br />  openssl-1.1<br />  <a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/cli/azure/install-azure-cli-linux?pivots=script">Linux に Azure CLI をインストールする</a></p> <p><strong>2.azure-cliのインストール</strong><br />  yay -S aur/azure-cli でインストール</p> <p><strong>3.azure devopsのインストール</strong><br />  下記を参考にazure devopsをインストール。<br />  1から4まで実行すると、デフォルトの組織、プロジェクトの設定までできるのでやっておく。<br />  <a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/azure/devops/cli/?view=azure-devops">Azure DevOps CLI の概要</a></p> <p><strong>4.PATの設定</strong><br />  Azure DevOpsにcliで接続するために、下記を参考にPATを作成。<br />  PATは作成時にトークンが表示されるが、ウィンドウを閉じると二度と確認ができないため、環境変数に設定するなどをして保存しておくこと。<br />  <a target="_blank" rel="nofollow noopener" href="https://learn.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows#create-a-pat">個人用アクセス トークンを使用する</a></p> <p><strong>5.az loginの実行</strong><br />  az login --use-device-code を実行してログイン。<br />  az loginでログインしようとすると、「localhostに接続できません」と表示されるので、オプションをつけて実行する。</p> <p><strong>6.az devops loginの実行</strong><br />  az devops login --organization https://dev.azure.com/{Organization} を実行してログイン。<br />  az loginを事前にしていればトークンの指定は不要、とのことだけど、トークンの入力を促すメッセージは表示されるし、トークンを入れても失敗と表示される。<br />  だけど、接続はできるようになっている。理由は不明。<br />  トークンの指定不要であればPATはいらないのでは、と思ったけれど、PATをrevokeすると接続ができなくなるので、PATは必要。</p> <p>azコマンドでリソースを参照できること、az boardsでワークアイテムの登録までできることを確認。</p> ao-iro tag:crieit.net,2005:PublicArticle/18411 2023-03-21T22:33:28+09:00 2023-03-25T13:04:56+09:00 https://crieit.net/posts/Arch-Linux-WSL2-Carbon-2023-03-21 Arch Linux(WSL2)にCarbonをインストール(2023/03/21時点で未達) <p>Arch Linux(WSL2)にCarbonをインストールしてみようとした際の流れを記載。<br /> 2023/03/21時点で、エラーを解消できずに未達。</p> <p><strong>1.必要なパッケージをインストール</strong><br />  必要と思われる下記のパッケージをインストールした。<br />   ・bazel 6.0.0-2<br />   ・clang 15.0.7-2<br />   ・llvm 15.0.7-2<br />   ・lld 15.0.7-2<br />   ・libc++- 15.0.7-3<br />   ・libunwind 1.6.2-2</p> <p><strong>2.Carbonコードをgitからクローン</strong><br />  <a target="_blank" rel="nofollow noopener" href="https://github.com/carbon-language/carbon-lang#getting-started">Getting started</a>を参照。</p> <p><strong>3.ビルドと実行</strong><br />  <a target="_blank" rel="nofollow noopener" href="https://github.com/carbon-language/carbon-lang#getting-started">Getting started</a>を参照。</p> <p>ここで下記のエラーが発生。<br /> libunwind.aが見えていないようなんだけれど、インストールはできていた。<br /> .bash_profileにも「LD_LIBRARY_PATH」を追加してみたけど、エラーは解消できず。<br /> オプションをつけて、「bazel run //explorer -- ./explorer/testdata/print/format_only.carbon --linkopt=-L/usr/lib」で実行してみても変わらなかった。<br /> どうすればいいのかな。<br /> (2023/03/25追記)lddでライブラリを追加できるか試したけれど、参照できていないlibunwind.aは静的ライブラリなので、lddでは追加できない模様。<br /> <a href="https://crieit.now.sh/upload_images/03ba43d531f0692283dcc3b4f26ba2b66419b1676283b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/03ba43d531f0692283dcc3b4f26ba2b66419b1676283b.png?mw=700" alt="エラー" /></a></p> <p><strong>【参考】Ubuntu 20.04(WSL)で試してみた結果</strong><br />  ① 必須パッケージのインストール<br />   <a target="_blank" rel="nofollow noopener" href="https://github.com/carbon-language/carbon-lang/blob/trunk/docs/project/contribution_tools.md#debian-or-ubuntu">セットアップコマンド(Debian または Ubuntu)</a><br />  ② bazelのインストール<br />   上記だとbazel、llvmのインストールに失敗したため、個別に対応。<br />   <a target="_blank" rel="nofollow noopener" href="https://bazel.build/install/ubuntu?hl=ja#install-on-ubuntu">Ubuntu への Bazel のインストール</a><br />   ③ 下記を参考にセットアップを実施<br />   llvmのインストールなど、設定を追加<br />   <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/shiena/articles/6ef15e65a87b96">Linux(WSL)でCarbonを動かしてみた</a><br />   ④ 実行<br />   gitからcloneして実施してみたが、下記のエラーが発生した。<br />   <a href="https://crieit.now.sh/upload_images/6fa2b32f4952182d8cea3e2bad21f642641e7115775a0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6fa2b32f4952182d8cea3e2bad21f642641e7115775a0.png?mw=700" alt="image" /></a><br />  ⑤ bazelでプログラムだけでなく「carbon-explorer」もコンパイルしてメモリが足りていないのかな、と考えて「carbon-explorer」をインストール。<br />   <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/shiena/articles/6ef15e65a87b96#carbon-explorer%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">carbon-explorerをインストール</a><br />  ⑥ 実行<br />   できた!<br />   <a href="https://crieit.now.sh/upload_images/3d83e63948259ce4968109df94db7be6641e72002a8a1.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3d83e63948259ce4968109df94db7be6641e72002a8a1.png?mw=700" alt="image" /></a></p> ao-iro tag:crieit.net,2005:PublicArticle/18410 2023-03-21T19:48:40+09:00 2023-03-21T20:40:38+09:00 https://crieit.net/posts/Azure-Data-Factory-Azure-DevOps Azure Data Factory、Synapse AnalyticsとAzure DevOpsの連携 <p>何回やっても時間が空くと忘れるのでメモ。<br /> Synapse Analyticsの場合も同じだったので、Synapse Analyticsで実施する場合は、下記のAzure Data FactoryをSynapse Analyticsに読み替える。</p> <p><strong>1.Azure DevOpsにサインインする。</strong><br />  Azure Data Factory(以降、ADF)と連携する、組織、プロジェクトを作成する。<br />  公開しないのであれば、Privateで問題ない。</p> <p><strong>2.組織をAzure AD登録する。</strong><br />  ADFと連携する組織の「設定」から、Azure AD連携を行う。<br />  この時、Azure AD連携を行うとサインアウトになって、再度サインインが必要となった。<br />  次にサインインする場合は、Azure DevOpsの更新HPから「無料で始める」をクリックする。<br />  サインインすると無料アカウントのディレクトリになっているので、ディレクトリの切り替えを行って、Azure AD登録したディレクトリを選択すると、作成した組織、プロジェクトが確認できる。</p> <p><strong>3.リポジトリを初期化する。</strong><br />  プロジェクトの「Repos」から、リポジトリの初期化を行う。<br />  mainブランチが設定される。</p> <p><strong>4.ADFと連携する。</strong><br />  ADFのFactory Studioにサインインし、管理画面の「Source control」>Git Configurationを選択して、Azure DevOpsと連携設定を行う。<br />  Azure AD登録をしていない組織は表示されない。<br />  リポジトリ、コラボレーションブランチ、発行ブランチなどを設定し、「適用」をクリックする。</p> ao-iro tag:crieit.net,2005:PublicArticle/18286 2022-08-21T16:18:27+09:00 2022-08-21T16:18:27+09:00 https://crieit.net/posts/VSCode-WSL2-ArchLinux-R VSCode+WSL2(ArchLinux)+Rの環境設定 <p>WSL2(ArchLinux)にRをインストールして、VSCodeで動かすために行った設定のまとめ</p> <p>1.WSL2にRをインストール<br /> <code>yay -S community/r-base</code></p> <p>2.WSL2にtck/tlをインストール<br /> ※これをインストールしないと、文字化けを改善するためのlanguageserverを設定するためのダイアログが表示できず、文字化けを解消できない。<br /> <code>yay -S aur/r-tcltk2</code></p> <p>3.WSL2にr-jsonliteをインストール<br /> jsonファイルを読み込むためのものなのか、これをインストールしないとVSCode側でエラーメッセージが表示される<br /> <code>yay -S r-jsonlite</code></p> <p>4.Rのセッションでlanguageserverをインストール<br /> ダイアログが開いて言語を選択できるので「日本語」を設定する。<br /> <code>$R</code><br /> <code>> install.packages("languageserver")</code></p> <p>5.拡張機能をVSCodeにインストール<br /> <a href="https://crieit.now.sh/upload_images/867be2ea44798c88870fcb65e20cd8096301d97feb05c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/867be2ea44798c88870fcb65e20cd8096301d97feb05c.png?mw=700" alt="image.png" /></a></p> <p>6.VSCodeでRのパスを設定<br /> Settingsを開いて、Rのインストールパスを設定する</p> <p>7.VSCodeで挙動確認<br /> Rのプログラムを実行して、プログラムが動くこと、グラフが表示されることを確認する</p> ao-iro tag:crieit.net,2005:PublicArticle/18171 2022-04-18T17:53:40+09:00 2022-04-18T17:53:40+09:00 https://crieit.net/posts/Win32API-Drag-Drop Win32APIでDrag&Dropしたファイルをある場所にコピーする方法 <p><strong>Win32APIでDrag&Dropしたファイルをある場所にコピーする方法</strong></p> <p>1.宣言</p> <pre><code class="CPP">#include "Shlwapi.h" // Shlwapi.hの関数を使用するために下記の追加が必要 #pragma comment (lib, "Shlwapi.lib") </code></pre> <p>2.実処理</p> <pre><code class="CPP"> UINT n; UINT i; UINT ret; TCHAR pszBuff[MAX_PATH * 10] = {}; TCHAR pszNewFile[MAX_PATH * 10] = { _T("\\\\wsl$\\Arch\\mnt\\wsl\\share")}; n = DragQueryFileA((HDROP)wParam, -1, NULL, 0); for (i = 0; i < n; i++) { ret = DragQueryFile((HDROP)wParam, i, pszBuff, MAX_PATH * 10); if (ret == -1) continue; LPWSTR fileName = PathFindFileNameW(pszBuff); wsprintf(pszNewFile, L"%s\\%s", pszNewFile, fileName); // 第3引数がFalseなので、コピー先に同名ファイルがあった場合は上書保存 // TRUEにした場合は、失敗してエラーになる CopyFile(pszBuff, pszNewFile, FALSE); } </code></pre> <p>Drag&Dropしたファイルを、WSL2のマウントフォルダに格納するようにした。<br /> Shlwapi.hの関数は「PathFindFileNameW」。<br /> ヘッダをincludeしただけだと、「未定義の関数」としてビルド時にエラーになる。<br /> 「#pragma comment (lib, "Shlwapi.lib")」を追記すると、Shlwapi.libをプロジェクトに参照追加しなくても動作するようになる。<br /> 理由がわかっていないので調査したい。</p> <p>「PathFindFileNameW(pszBuff)」を実行して取得できるのは「xxxx.txt」のようなファイル名部分となる。<br /> 「PathFindFileNameW」を使用しているのは、TCHARを使用しているから。<br /> CHARを使用する場合はたぶん「PathFindFileNameA」を使用するんだと思う。</p> <p>「wsprintf(pszNewFile, L"%s\%s", pszNewFile, fileName);」で、変数pszNewFileにコピー先のpathと取得したファイル名を連結している。</p> ao-iro tag:crieit.net,2005:PublicArticle/18155 2022-03-15T23:44:55+09:00 2022-03-15T23:49:45+09:00 https://crieit.net/posts/WinSCP-bat WinSCPのコマンドを使ったbatでファイルを取得するサンプル <p>WinSCPのコマンドを使って、ファイルを取得するbatのサンプルは下記。</p> <p>目的:<br /> 指定した日付以降のファイルをダウンロードしたい</p> <p>引数:<br /> 1.パスワード<br /> 2.IPアドレス(IPアドレスが固定じゃない場合用)<br /> 3.目的の「指定した日付」に該当する年月日(フォーマット:MM/DD/YY)</p> <pre><code>rem 引数の設定 set password=%1 set addr=%2 set date=%3 rem 保存したセッション情報を使用する場合 rem set remoteSession="保存したセッション名" rem 実行ファイル set WinSCP="実行ファイルパス\WinSCP.com" rem 実行するスクリプト set scriptFile="スクリプトファイルパス\scriptFile.txt" rem ダウンロード用フォルダ set downloadFolder=ダウンロードフォルダパス rem ダウンロード用一時フォルダ set tempFolder=temp set tempPath=%downloadFolder%%tempFolder%\ cd /d %downloadFolder% rem 一時フォルダがない場合は作成する if not exist %tempFolder% mkdir %tempFolder% rem 保存したセッション情報を使用する場合 rem echo open %remoteSession% > %scriptFile% rem SCPでセッションopen echo open scp://ユーザー名:%password%@%addr%:22 > %scriptFile% echo cd ダウンロードするファイルパス >> %scriptFile% rem バイナリモードに変更 echo option transfer binary rem ダウンロード echo get ./* %tempPath% >> %scriptFile% rem セッションクローズ echo close >> %scriptFile% rem WinSCPのコンソールをclose echo exit >> %scriptFile% rem スクリプトファイルを実行 @%WinSCP% /script=%scriptFile% rem xcopyで対象日付以降のファイルをダウンロードフォルダに移動 xcopy /Y /D:%date% %tempPath%\* %downloadFolder% rem 一時フォルダを削除 rmdir /s /q %tempFolder% cd ../ </code></pre> <p>callコマンドで、findを使った指定した更新日付以降の取得結果を絞り込めるかと思ったけれど、下記のようにした場合、【get 抽出したファイルのダウンロード】の部分は、callで実行されるリモート側のシェルコマンド扱いなので、get をWinSCPのコマンドとして認識してくれない。当然かもしれないけれど。</p> <p><code>call 【指定した更新日付以降のファイルの抽出】 | 【get 抽出したファイルのダウンロード】</code></p> <p>そうすると、ファイルを選別してダウンロードするためには、以下の方法になりそう。</p> <p>1.callでダウンロードファイルを選別して、リネーム、もしくは一時ディレクトリにコピーしてからgetでダウンロード。ダウンロード後に一時ディレクトリは削除。</p> <p>2.ダウンロード後にファイルを選別し、不要なファイルを削除。</p> <p>上記だと2.の手段のほうが、リモートファイルを操作しないから安全かも。<br /> 他に方法あるのかなぁ。</p> ao-iro tag:crieit.net,2005:PublicArticle/18153 2022-03-13T18:31:26+09:00 2022-03-13T18:31:26+09:00 https://crieit.net/posts/WSL2-Arch-systemctl WSL2(Arch)でsystemctlを使用できるようにするために行ったこと <p>環境:<br /> WSL=WSL2<br /> ディストリビューション=Arch</p> <p>TeraTarmでSSH接続をしたかったけれど、デフォルトではsystemctlが実行できないようだったので、設定を行った。</p> <p>【使用したもの】<br /> <a target="_blank" rel="nofollow noopener" href="https://rustrepo.com/repo/nullpo-head-wsl-distrod">Distrod</a></p> <p>【設定方法】<br /> 動いていたArchに入れたので、下記のページのOption2を実行<br /> <a target="_blank" rel="nofollow noopener" href="https://rustrepo.com/repo/nullpo-head-wsl-distrod#option-2-make-your-current-distro-run-systemd">Option 2: Make your Current Distro Run Systemd</a></p> <p>★実行内容<br /> 手順1:記載されている通りに実施<br /> 手順2:下記のほうを実行<br /> <code>/opt/distrod/bin/distrod enable</code><br /> 手順3は実行してもエラーとなっただけだった。</p> <p>【実行後】<br /> systemctl が利用できるようになっていて、daemonの再起動などもできるようになった。<br /> 便利。</p> ao-iro tag:crieit.net,2005:PublicArticle/18152 2022-03-13T17:19:46+09:00 2022-03-13T17:20:40+09:00 https://crieit.net/posts/Python-unittest-ResourceWarning-unclosed-file Pythonのunittest実行時に、「ResourceWarning: unclosed file」が発生する場合の対処方法 <p>Pythonでunittestを実行していた際に、「ResourceWarning: unclosed file」が出力されたので、その対処方法について、記載。</p> <pre><code>global logins def log_setting(log_level): global logins home = '<ログファイルパス>' pid = os.getpid() # create logger logins = logging.getLogger(__name__) logins.setLevel(logging.DEBUG) # create File Handler fh = logging.FileHandler('{0}/log/log{1}.log'.format(home, pid)) fh.setLevel(logging.INFO) # create Formatter fh_formatter = \ logging.Formatter( '%(asctime)s - %(levelname)s - \ %(filename)s - %(name)s - %(funcName)s - %(message)s') # set Formatter fh.setFormatter(fh_formatter) # add Handler logins.addHandler(fh) # test logging logins.info('logtest:addHandler') </code></pre> <p>↑みたいな関数があり、unittest側からは下記でテストメソッド単位で呼び出したとする。</p> <pre><code>def setUp(self): logtest.log_setting(logging.DEBUG)` def tearDown(self): logtest.logins.handlers = [] </code></pre> <p>この場合、unittestを実行すると、ログファイル内に「ResourceWarning: unclosed file」が出力される。<br /> 理由はログファイルがクローズされていない状態で、ハンドラをクリアしているから。<br /> ハンドラをクリアしている理由は、そうしないとテストメソッドの実行の都度、「log_setting」が呼び出されてハンドラが追加され、ログが重複して出力されてしまうから。</p> <p>ログファイルをクローズする処理を入れればいいので、下記のようにする。</p> <pre><code>def tearDown(self): logtest.logins.handlers[0].close() logtest.logins.handlers = [] </code></pre> <p>こうすると、ログファイルをクローズした後にハンドラをクリアするので、警告は出力されない。<br /> ログも重複しない。</p> <p>本当にいいのは、テスト対象側のプログラムを修正することだと思う。<br /> ファイル出力しかしない想定であれば、addHandlerを使う必要はなく、下記で対応ができる。↓のほうがコード短いし、↑よりもいいかな。</p> <p>```<br /> def log_setting(log_level):<br /> global logins<br /> home = '/home/aoiro/work/logtest'<br /> pid = os.getpid()</p> <pre><code># create logger logins = logging.getLogger(__name__) log_format = \ '%(asctime)s - {} - %(levelname)s - %(message)s'.format("tester") logging.basicConfig( filename='{0}/log/log{1}.log'.format(home, pid), level=log_level, format=log_format) </code></pre> <p>```</p> ao-iro tag:crieit.net,2005:PublicArticle/17823 2021-12-05T22:37:31+09:00 2021-12-05T22:37:31+09:00 https://crieit.net/posts/Azure-Pipeline-61acc09b3b51d Azure Pipelineを使ってリリースする場合の構成の検討 <p>Azure Pipelineを使った場合の利点の1つに、リリースするARMテンプレートにはないリソースを削除するところまで自動化できる、という点があると思う。<br /> カスタムデプロイを使用した場合、リソースの差分は手動で削除しないといけないし、完全デプロイをコマンドラインから実行すると、リソースグループ単位で再構成される(確か)<br /> なので、きれいにリリースができるのはとてもいい。</p> <p>で、じゃあリリースに失敗しても綺麗に戻せるね、って考えたときに、どこから戻す?</p> <p>本番ADFはライブモードで運用するから、戻すといったらARMテンプレートになるけど、カスタムデプロイは前述のように差分が残る<br /> なので、開発ADF(もしくは検証用ADF)から戻すことになる</p> <p>開発ADFのブランチ構成は、基本的に以下のようになる<br /> ・adf_publish:ライブモードの環境<br /> ・main:プルリクエストで反映、adf_publishへ発行用<br /> ・work:作業用</p> <p>adf_publishの内容をリリースする、とした場合、流れは以下<br /> work→(プルリクエスト)→main→(発行)→adf_publish→(Azure Pipeline)→本番ADF</p> <p>戻そう、とした場合、本番ADFの状態をどこかに保持しておかないといけない<br /> そうした場合、adf_publshに保存用のブランチを作成しておくほうが無難なんだろうか</p> <p>work→(プルリクエスト)→main→(発行)→adf_publish→(Azure Pipeline)→本番ADF<br />                        ∟yyyymmdd_release</p> <p>上のような構成にしておいて、本番ADFへの反映で失敗したら、yyyymmdd_releaseブランチから戻す<br /> でも、Azure Pipelineのリリースは、Artifactsが必要で、Artifactsは手動実行できない<br /> 退避しているブランチに変更入れるわけにはいかない</p> <p>そうなると、ブランチはmainに作成したほうがいいんだろうか</p> <p>work→(プルリクエスト)→main→(発行)→adf_publish→(Azure Pipeline)→本番ADF<br />               ∟yyyymmdd_release</p> <p>mainはプルリクエストで変更分をいろいろマージすると思うけど、リリースタイミングでブランチを切っておいて、失敗したらリリースタイミングのブランチで戻して、adf_publishに発行して、本番ADFに反映<br /> いまいちな気がする</p> <p>work→(プルリクエスト)→main→(発行)→adf_publish→(Azure Pipeline)→本番ADF<br />                        ∟yyyymmdd_release<br /> ↑の構成にして、リリース物件に更新用のreadmeを格納して、そこを更新して戻す、のほうがよさそう<br /> readmeを更新した際のコミットコメントは「リリースに失敗したため、戻し作業を実施」とか?<br /> ちょっとカッコ悪いかな</p> ao-iro tag:crieit.net,2005:PublicArticle/17820 2021-12-04T23:58:56+09:00 2021-12-05T14:19:28+09:00 https://crieit.net/posts/Azure-Pipeline-61ab823000e83 Azure Pipelineを使ったリリースの実施方法2 <p>Azure Pipelineでリリースした際に、増分リリースだと名称変更などした場合に反映先ADFにリソースが残ってしまうので、その対処方法について確認。</p> <p>◆前提<br /> 増分リリース</p> <p>◆前準備<br /> ・デプロイ前後に実行するスクリプトの準備<br /> 参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-sample-script#pre--and-post-deployment-script<br /> 上記をそのままコピーして、反映元のブランチにPowerShellスクリプトとして保存する<br /> トリガーの停止も組み込まれているので別途用意する必要はない<br /> デプロイ前、デプロイ後の処理も、スクリプト実行時の引数で切り分けて実行するようになっている</p> <p>◆手順<br /> 1.ジョブの追加<br /> 参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-sample-script#script-execution-and-parameters<br /> リリースの前後に、PowerShellを実行するジョブを追加する<br /> デプロイ前のジョブのScript Argumentsには下記を設定する</p> <pre><code>-armTemplate "$(System.DefaultWorkingDirectory)/<your-arm-template-location>" -ResourceGroupName <your-resource-group-name> -DataFactoryName <your-data-factory-name> -predeployment $true -deleteDeployment $false </code></pre> <p>デプロイ後のジョブのScript Argumentsには下記を設定する</p> <pre><code>-armTemplate "$(System.DefaultWorkingDirectory)/<your-arm-template-location>" -ResourceGroupName <your-resource-group-name> -DataFactoryName <your-data-factory-name> -predeployment $false -deleteDeployment $true </code></pre> <p>下記のような感じになる<br /> <a href="https://crieit.now.sh/upload_images/191cb15ca7ce9bc06195aff18bf92f4261ab72ddf4234.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/191cb15ca7ce9bc06195aff18bf92f4261ab72ddf4234.png?mw=700" alt="image" /></a></p> <p>2.保存して動作確認</p> <p>★注意<br /> トリガーを削除して同じ名前で異なる種類のトリガーを作成したら、リリースでエラーが発生する<br /> 同名トリガーの型を更新できない、というエラーだった<br /> TriggerTypeCannotUpdate: Trigger type cannot be updated.null</p> <p>DataFactoryでトリガーを再作成しようとすると、一度トリガー削除→発行→再作成という手順をとらないといけないけど、Azure Pipelineでも同様らしい</p> <p>↑スクリプトを修正して解決できた<br /> 対処方法は下記。</p> <p>前準備で作成したスクリプトに下記を追加する<br /> ① $triggersToStartの下くらいに以下を追加<br /> 同名、かつ、テンプレート内と反映先でタイプの違うトリガーを取得</p> <pre><code>#Trigger reCreate $triggersNameAndTypeInTemplate = $triggersInTemplate | ForEach-Object { New-Object PSObject -Property @{ Name = $_.name.Substring(37, $_.name.Length-40) TriggerType = $_.Properties.type } } $triggersToReCreate = $triggersToStop | ForEach-Object { foreach($entry in $triggersNameAndTypeInTemplate.GetEnumerator()) { if (($entry.Name -eq $_.Name) -and ($_.TriggerType -ne $entry.TriggerType)) { Write-Host "reCreate target trigger name " $_.Name New-Object PSObject -Property @{ Name = $_.Name TriggerType = $_.TriggerType } } } } </code></pre> <p>② if ($predeployment -eq $true) {}のブロックの中の、$triggersToStop | ForEach-Object {}のブロックの次に以下を追加</p> <pre><code> #Delete reCreate trigger Write-Host "Deleting triggers for reCreate" $triggersToReCreate | ForEach-Object { Write-Host "Deleting trigger " $_.Name $trig = Get-AzDataFactoryV2Trigger -name $_.Name -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName if ($trig.RuntimeState -eq "Started") { if ($_.TriggerType -eq "BlobEventsTrigger" -or $_.TriggerType -eq "CustomEventsTrigger") { Write-Host "Unsubscribing trigger" $_.Name "from events" $status = Remove-AzDataFactoryV2TriggerSubscription -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_.Name while ($status.Status -ne "Disabled"){ Start-Sleep -s 15 $status = Get-AzDataFactoryV2TriggerSubscriptionStatus -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_.Name } } Stop-AzDataFactoryV2Trigger -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_.Name -Force } Remove-AzDataFactoryV2Trigger -Name $_.Name -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Force } </code></pre> ao-iro tag:crieit.net,2005:PublicArticle/17817 2021-12-04T14:24:27+09:00 2021-12-04T22:02:47+09:00 https://crieit.net/posts/Azure-Pipeline Azure Pipelineを使ったリリースの実施方法1 <p>Azure Pipeline使って別のDataFactoryへのリリースをやってみたので、備忘録。<br /> 記載するのはAzure Pipelineを使ったリリースまでで、トリガーの設定変更や、削除したリソースの反映までは行っていない</p> <p>実行したのは下記なので、それぞれ手順を記載<br /> ・mainブランチに変更が入った場合にトリガー起動でリリース<br /> ・adf_publishへの発行をトリガーとしてリリース</p> <p>◆前提<br /> 増分デプロイ</p> <p>◆使ったDataFactory<br /> 開発ADF:作業用:DevOpsにコラボレーションブランチを作成済み<br /> 本番ADF:開発ADFのリリース先:ライブモード</p> <p>◆前準備<br /> 1.開発ADFのコラボレーションブランチを作成しているプロジェクトにサービス接続を作成する<br />  プロジェクトは作成していたけど、サービス接続を作成してなかったからリリースを作成してもデプロイできなかった<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/deployment-tutorial-pipeline#create-a-devops-project">https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/deployment-tutorial-pipeline#create-a-devops-project</a><br /> 2.ブランチの役割を決めておく<br />  リリース先に反映するブランチを決めておく<br />  下記の構成で、mainブランチをデフォルトブランチにしてリリース設定をすると、workからのプルリクエストを許可した時点で本番ADFに反映される<br />  adf_publish:ライブモードの動作環境。mainブランチで発行することで、mainの内容が反映される<br />  mainブランチ:workの内容をプルリクエストでマージする先<br />  workブランチ:開発用</p> <p>◆手順(mainブランチに変更が入った場合にトリガー起動でリリース)<br /> 1.ビルド用のパイプラインを作成する<br /> 参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-improvements#create-an-azure-pipeline<br />  package.jsonの作成や場所は、リリース用のブランチのどこか<br />  公式のyamlの部分を作成環境に合わせて修正する<br />  $(Build.Repository.LocalPath)=ブランチの/(ルート)に該当するので、ブランチの直下に格納する場合は記載不要<br />  ブランチの直下に「build」フォルダを作成した場合は、「build」と記載する。<br />  $(Build.Repository.LocalPath)はコンテナ内にチェックアウトされたリソースフォルダを指している</p> <p>2.リリースを作成する<br /> 参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-automate-azure-pipelines<br /> 上記の手順の「Azure Pipelines リリースをセットアップする」6.で、↑の1で作成したパイプラインを指定すると、トリガー起動するようになる(Source typeで「Build」を選択する)<br /> <a href="https://crieit.now.sh/upload_images/31ced423cdfc97a2fbc50efcd6b0f62261aaf810075b4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/31ced423cdfc97a2fbc50efcd6b0f62261aaf810075b4.png?mw=700" alt="パイプライン設定" /></a></p> <p>「Azure Resource Manager connection」では、前準備で作成したサービス接続を選択する<br /> 前準備で作成したサービス接続を選択しないとサブスクリプションやリソースグループを選択できない</p> <p>タスクを設定する際に選択するARMテンプレートは、リリースするブランチに格納してある、ARMTemplateForFactory.jsonと、ARMTemplateParametersForFactory.json<br /> 今回は開発ADF→本番ADFなので、「Override template parameters」でfactoryNameを上書きしている<br /> <a href="https://crieit.now.sh/upload_images/f17630380252a15b2097436eb7e0327661aaf9f3e1e34.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f17630380252a15b2097436eb7e0327661aaf9f3e1e34.png?mw=700" alt="image" /></a></p> <p>3.保存して動作確認<br /> 問題なければ、デフォルトブランチに変更内容を反映することでリリースまで実行される</p> <p>★注意点<br /> 1で作成したビルド用のパイプラインで出力されるARMテンプレートは、adf_publishに反映されない<br /> なので、adf_publishに反映する場合は「発行」を押下する必要がある</p> <p>◆手順(adf_publishへの発行をトリガーとしてリリース)<br /> ※「mainブランチに変更が入った場合にトリガー起動でリリース」1の手順は不要</p> <p>1.リリースを作成する<br /> 参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-automate-azure-pipelines<br /> 上記の手順の通りにSource typeで「Azure Repos Git」を選択する<br /> Defult branchでadf_publishを選択する</p> <p>2.トリガーを設定する<br /> 稲妻のアイコンを押下して、トリガーを設定する<br /> 今回はadf_pulishへの発行をトリガーにするので、Continuous deployment triggerを有効にして、Branchに「adf_publish」を選択する<br /> <a href="https://crieit.now.sh/upload_images/1785d0681a21580d5c0754d51a37a89561ab666beb666.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1785d0681a21580d5c0754d51a37a89561ab666beb666.png?mw=700" alt="image" /></a></p> <p>3.リリースを作成する<br /> 「mainブランチに変更が入った場合にトリガー起動でリリース」2と同じ</p> <p>4.保存して動作確認</p> ao-iro tag:crieit.net,2005:PublicArticle/17714 2021-10-16T18:37:27+09:00 2021-10-16T18:37:27+09:00 https://crieit.net/posts/506eb3055dfc0066435c1a4610ed16bd クラスオブジェクトのシリアル化 <p>PythonでクラスオブジェクトをJsonに出力できると知ったので、メモ。</p> <p>シリアル化、という手段で、通常はメモリに保持されるクラスオブジェクトを、バイナリ変換してファイル出力できるようにできるとのこと。<br /> 利点としては、プログラムが終わった後にクリアされてしまうクラスオブジェクトの情報を、ファイルやDBなどに保存しておくことができ、再作成の必要がなくなるという点。</p> <p>復元する、他のプログラムと共有する、DBに保存しておいて呼び出す。<br /> 色々使い道がありそう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tanabe13f/items/a8a84368290d5b8da092">Python でクラスオブジェクトをJSON形式にする・戻す</a></p> <p>クラス内部で複数の変数を定義しておいて、クラスオブジェクトを生成して値を格納して、それをjsonでダンプしておけば、ある程度の長さならDBのString型カラム1つに保存することができて、後は必要に応じて呼び出して復元するっていうのもできるのか。<br /> カラムに分けて格納してselectしてそれぞれ成形して…ってやるよりも楽かな。</p> <p>クラスオブジェクトを保存する必要が無ければ、シリアル化は不要、ということになるのかな?<br /> プログラム実行後に復元や、2回目以降に再利用する必要がなければ不要か。</p> <p>例えば、データに対する処理が前回実行結果の一部を更新していくような場合、とか?<br /> DBに格納した前回実行結果を取得して、CSVファイルから今回変更分を読み込んで、反映してデータを最新化して、DB登録、という流れの場合は採用できるかな。</p> <p>1.DBに格納した前回実行結果を取得:selectの実行<br />  →dumpしたクラスオブジェクトをDBに保存していた場合、同様にselectを実行<br />   ただ、jsonにダンプしていた場合は、デシリアライズすることでクラスインスタンスが復元される<br />   DBからカラムでデータを取得した場合はクラスオブジェクトを生成して設定するところから始める</p> <p>2.CSVファイルから今回変更分を読み込む<br />  →処理内容に違いはない</p> <p>3.反映してデータを最新化<br />  →処理内容に違いはない</p> <p>4.DB登録:insert(update)の実行<br />  →カラムに分けたデータか、クラスオブジェクトかの違い</p> <p>この例だと大きな差は1くらい?<br /> こういう時に有利!っていう状況ないかな。</p> ao-iro tag:crieit.net,2005:PublicArticle/17695 2021-10-03T08:57:25+09:00 2021-10-03T09:49:35+09:00 https://crieit.net/posts/BitBucket-Google Bitbucketの始め方(Googleアカウントを使用した場合) <p>Bitbucketを使用した際に、cloneができなかったのでその対処方法を調べたら下記でできた。</p> <p><a target="_blank" rel="nofollow noopener" href="https://zenn.dev/grahamian/articles/58381c7fef9a3b">BitbucketにGoogle認証している人はcloneためにパスワードを発行しましょう</a></p> <p>Google認証とか、他のサービスと連携せずにアカウント作成した場合には、アカウント作成時のパスワードでcloneできるんだろうな...</p> <p>上記でcloneできたものの、pushできなかったので、下記を参考に実施。<br /> 難しい…</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/shumpeism/items/bc62cd4c19f09c36d890">bitbucketにpushできない</a></p> ao-iro tag:crieit.net,2005:PublicArticle/17636 2021-09-05T22:38:06+09:00 2021-09-05T22:38:06+09:00 https://crieit.net/posts/Azure-Synapse-Analytics-2021-9-5 Azure Synapse Analyticsの覚書(2021/9/5) <p>Azure Synapse Analyticsについて、覚えたことを記載。</p> <ul> <li>Synapse Analyticsのメモリについて<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/memory-concurrency-limits#data-warehouse-capacity-settings">データ ウェアハウスの容量設定</a></li> </ul> <p>上記にあるように、DWU毎にサービスレベルが決まっている。<br /> 「データウェアハウスあたりのメモリ」はディストリビューションの総メモリサイズとなっている。<br /> 200DWUであれば、データウェアハウスあたりのメモリは120GBとなっていて、「コンピューティングごとの配布」が60となっている。<br /> 「コンピューティングごとの配布」に記載されている値は、データウェアハウスのディストリビューション数。<br /> そのため、1ディストリビューションあたりのメモリサイズは2GBとなる。</p> <ul> <li>動的リソースクラス<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/resource-classes-for-workload-management#dynamic-resource-classes">動的リソース クラス</a></li> </ul> <p>Synapse Analyticsでは、ユーザーに動的にメモリを割り当てることができる。<br /> 最初のユーザー(管理者ユーザー)はsmallrcから変更できないため、smallrc以外のリソースクラスを割り当てる場合は、専用のユーザーを作成する必要がある。<br /> xlargercを割り当てると、メモリの70%をユーザーの処理に使用する。<br /> これは、1ディストリビューションあたりのメモリの割り当てなので、上記の例にならって、200DWUであれば、xlargercを割り当てられたユーザーが使用可能な最大メモリは、2GB×70%=1.4GBとなる。多分。<br /> リソースクラスの割り当ては課金対象ではないので、DWUを上げる前にリソースクラスの見直しをして、使用可能なメモリサイズを調整してからDWUを上げてもいいかもしれない。</p> <ul> <li>メモリの見積もり<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-memory-optimizations-for-columnstore-compression#how-to-estimate-memory-requirements">メモリ要件の見積もり方法</a></li> </ul> <p>テーブルにデータ移行を行う場合は、上記からメモリの見積もりを行ったほうがよい。<br /> 数百カラムのテーブルのデータ移行を行う場合、列圧縮に必要なメモリが足りなくて、データ移行時にエラーが発生する可能性がある。</p> <ul> <li>select-insertするstored procedureを作成する場合はSSMSから実行する。<br /> Synapse Analytics Studioのクエリエディタからだと、select-insertを含むstored procedureのcreateがエラーになった。<br /> SSMSからだと問題なく作成できたし、動作した。<br /> バグ?</li> </ul> ao-iro tag:crieit.net,2005:PublicArticle/17635 2021-09-05T21:34:35+09:00 2021-09-05T21:41:26+09:00 https://crieit.net/posts/PowerShell-6134b95b1325f PowerShellで正規表現で対象行を抽出する方法 <p>PowerShellで特定の行を抽出する方法</p> <ul> <li>小数点以下n桁以上の値を持つ行を出力するコマンド</li> </ul> <pre><code>$re ='[0-9]\.[0-9]{n,}' select-string -path .\powershell.csv -pattern $re </code></pre> <p>出力結果は下記のようになる。<br /> powershell.csv:8:1.0 110.0 10.0 1.899999999<br /> powershell.csv:11:1.0 110.0 10.0 1.899999999</p> <hr /> <ul> <li>出力結果に含まれるファイル名部分を削除して、抽出した行のみ出力する方法</li> </ul> <pre><code>select-string powershell.csv -pattern $re | foreach-object { $($_ -split ":" )[3] } </code></pre> <p>出力結果は下記のようになる。<br /> 1.0 110.0 10.0 1.899999999<br /> 1.0 110.0 10.0 1.899999999</p> ao-iro tag:crieit.net,2005:PublicArticle/17444 2021-06-25T17:29:54+09:00 2021-06-25T17:29:54+09:00 https://crieit.net/posts/2c4ebed33891bec09c62208c94835aa4 クラウドサービスで構築する際のパラメータシート <p>通常、ものを作るときにはパラメータシートが出てくる。<br /> サーバーにOSをインストールするときも、バージョンはどうしますか、この設定はどうしますか、みたいにすごく細かくパラメータの設定項目が出てくる。</p> <p>クラウドサービスのSynapse Analyticsとか、仮想マシンとかを使ってサービスを構築しようとしたときにも同じようにパラメータシートが出てくるのは、当然だと思う。<br /> だけど、クラウドサービスって、1カ月で項目が追加されたり減ったりするから、パラメータシートを作るのがとても大変。<br /> しかも選択肢ごとにパラメータが変わってくるから、どのパラメータを設定するか決めていない場合に、パラメータシートで全部対応するのが本当に大変。<br /> 時間をかけて作っても、数か月後には確実にどこか変わってるし。</p> <p>パラメータシートを使わないとぶっつけ本番で構築することになるから、必要になるとは思うんだけど、その場合項目ってどうするのが正解なんだろう?<br /> あらかじめ要望を聞いて、これを使うだろうっていう想定の項目だけ記載したパラメータシートを展開するんだろうか。</p> <p>パラメータシート作成したくないなぁ。<br /> 下手したら次の日とか翌週には変わってるかもしれなくて、それを最新化して保守していかないといけないとか、無駄が過ぎる気がするんだよなぁ。</p> <p>クラウドサービスのそういう構築用資料の作成と保守ってどうしてるんだろう。</p> ao-iro tag:crieit.net,2005:PublicArticle/16439 2020-12-26T16:32:04+09:00 2020-12-26T16:33:43+09:00 https://crieit.net/posts/WSL WSLのディストリビューションの格納場所の移動 <p>WSLでUbuntuをインストールしたものの、Cドライブの容量が心元なかったため、ディレクトリ移動した際の手順を記述します。<br /> ``</p> <h5 id="◆手順"><a href="#%E2%97%86%E6%89%8B%E9%A0%86">◆手順</a></h5> <p><strong>1.ディストリビューションをtarファイルにエクスポート</strong></p> <pre><code>wsl --export Ubuntu-20.04 F:\Work\wsl\Ubuntu-20.04.tar </code></pre> <p><strong>2.ディストリビューションの削除</strong></p> <pre><code>wsl --unregister Ubuntu-20.04 </code></pre> <p><strong>3.ディストリビューションのインポート</strong></p> <pre><code>wsl --import Ubuntu-20.04 F:\Work\wsl\Ubuntu20.04 F:\Work\wsl\Ubuntu-20.04.tar </code></pre> <p>構文:<br /> wsl --import <ディストリ名> <インストールディレクトリパス> <1でエクスポートしたtar><br /> ※ ディストリ名は任意でいいらしい</p> <p>``</p> <p>思ったよりすごく簡単にできた。<br /> 3.でディストリ名を任意で設定できるということは、コピーしてディストリ名を別にすれば環境の複製もできるんだろうなぁ。</p> ao-iro tag:crieit.net,2005:PublicArticle/16233 2020-11-22T15:15:09+09:00 2020-11-22T15:19:13+09:00 https://crieit.net/posts/035caea8a06156ea0a3a051a59a5a248 Azure プライベートエンドポイント <h3 id="プライベートエンドポイント"><a href="#%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">プライベートエンドポイント</a></h3> <p>プライベートエンドポイントは、作成した仮想ネットワーク内のプライベートDNSゾーンと統合可能な、プライベートIPアドレス。<br /> 作成すると、対象仮想ネットワークのアドレス範囲内でIPアドレスが付与され、対象仮想ネットワーク内のリソースは、プライベートエンドポイントが指すリソースへ、DNS名で接続が可能となる。<br /> サービスエンドポイントの場合は許可されたサブネット範囲となっていたが、プライベートエンドポイントはNSGなどの設定も無視して、対象仮想ネットワーク内全般からアクセスが可能。</p> <p>以下のような構成を考える。</p> <ul> <li>仮想ネットワーク:vnet-main <ul> <li>サブネット:subnet-001 <ul> <li>仮想マシン:vm-001</li> <li>NIC:nic-001</li> <li>NSG:nsg-001 ※storage-Aへのアウトバウンドを拒否</li> </ul></li> <li>サブネット:subnet-002 <ul> <li>仮想マシン:vm-002</li> <li>NIC:nic-002</li> <li>NSG:nsg-002</li> </ul></li> </ul></li> <li>ストレージアカウント:storage-A</li> </ul> <p>storage-Aのプライベートエンドポイントをvnet-mainに作成すると、vm-001、vm-002はstorage-Aにアクセスができる。<br /> vm-001はNSGで拒否となっているが、プライベートエンドポイントでは無効となる。<br /> プライベートエンドポイントを設定したリソースがパブリックアクセスを拒否するかは、そのリソースの接続しだいとなる点はサービスエンドポイントと同じ。</p> <p>サービスエンドポイントとの違いは、対象の仮想ネットワーク内のリソースに対してアクセス制御を行えない点。</p> <h4 id="不明点"><a href="#%E4%B8%8D%E6%98%8E%E7%82%B9">不明点</a></h4> <ol> <li>上記のvnet-mainの他に、仮想ネットワークvnet-subが存在し、storage-Aがパブリックアクセスを拒否していた場合、vnet-sub内のリソースがstorage-Aにアクセスするためには、vnet-sub内にもプライベートエンドポイントを作成する必要があるのか?もしくは、プライベートリンクサービスを使用するのか?</li> </ol> <p>「Azure プライベートエンドポイントとは」<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/private-link/private-endpoint-overview">https://docs.microsoft.com/ja-jp/azure/private-link/private-endpoint-overview</a></p> <hr /> <p>プライベートエンドポイントの利点と使いどころがいまいち...。オンプレとの接続か、プライベートリンクサービスを使うとき以外はあまり使わないものなのか?</p> ao-iro tag:crieit.net,2005:PublicArticle/16232 2020-11-22T14:50:02+09:00 2020-11-22T15:17:00+09:00 https://crieit.net/posts/8c91f63281f3c50dbb5ee527d756bfa7 Azure サービスエンドポイント <h3 id="サービスエンドポイント"><a href="#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88">サービスエンドポイント</a></h3> <p>サービスエンドポイントは、ストレージアカウント、SQL Databaseなどのサービスに対して、接続を制限するための機能。<br /> サブネットに統合される。<br /> サービスタグ(Microsoft.SQLなど)があらかじめ設定されていて、サブネットやネットワークインターフェースに対して設定が可能。</p> <p>以下のような環境を考える。</p> <ul> <li>仮想ネットワーク:vnet-main <ul> <li>サブネット001:subnet-001 <ul> <li>仮想マシン:vm-001</li> <li>NIC:nic-001</li> <li>NSG:nsg-001</li> </ul></li> <li>サブネット002:subnet-002 <ul> <li>仮想マシン:vm-002</li> <li>NIC:nic-002</li> <li>NSG:nsg-002</li> </ul></li> <li>サブネット003:subnet-003 <ul> <li>仮想マシン:vm-003</li> <li>NIC:nic-003</li> <li>NSG:nsg-003</li> </ul></li> </ul></li> <li>ストレージアカウント:storage-A</li> </ul> <p>subnet-001、subnet--002のサービスエンドポイントに「Microsoft.Storage」と設定する。</p> <p> 1. storage-Aが何も接続設定をしていない場合<br />   仮想マシンvm-001、vm-002、vm-003はstorage-Aに接続できる<br />   ストレージアカウントは基本的に仮想ネットワーク内、およびインターネットからのアクセスを拒否しないため<br />   このとき、vm-001とvm-002はプライベートアクセス、vm-003はパブリックアクセスとなっている</p> <p> 2. storage-Aがsubnet-002にのみ接続可にしていた場合<br />   仮想マシンvm-001、vm-003は接続できず、vm-002は接続ができる<br />   vm-001はstorage-Aの接続設定で接続が拒否される<br />   vm-003はサービスタグが設定されていないため、パブリックアクセスを行おうとして拒否される</p> <p>サービスエンドポイントを使用した接続は、プライベートIPを使用したプライベートアクセスとなる。<br /> 対象の仮想ネットワーク内のアドレス範囲で決定されたプライベートIPアドレスを使用して接続が行われる。<br /> それ以外のアクセスはパブリックアクセスとなる。</p> <p>サービスエンドポイントの利点としては以下。</p> <ul> <li>インターネットや関係のないサブネット内のリソースからのアクセスを制御できる</li> <li>プライベート接続になるので、セキュリティ面で安全</li> </ul> <p>「仮想ネットワーク サービス エンドポイント」<br /> <a target="_blank" rel="nofollow noopener" href="https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-service-endpoints-overview">https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-network-service-endpoints-overview</a></p> ao-iro