<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ryanc</title>
    <description>The latest articles on DEV Community by ryanc (@ryanch79).</description>
    <link>https://dev.to/ryanch79</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F494631%2F82ff42bd-f6ec-403e-9d9d-8cfd54efe536.png</url>
      <title>DEV Community: ryanc</title>
      <link>https://dev.to/ryanch79</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryanch79"/>
    <language>en</language>
    <item>
      <title>AWS Managed ADのユーザーをGoogleに同期する</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Wed, 30 Jun 2021 02:19:42 +0000</pubDate>
      <link>https://dev.to/ryanch79/aws-managed-ad-google-481n</link>
      <guid>https://dev.to/ryanch79/aws-managed-ad-google-481n</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/ryanch79/aws-managed-ad-x-aws-sso-google-workspace-2kf8"&gt;AWS Managed AD x AWS SSOでGoogle Workspaceにログインする&lt;/a&gt;の記事で、AWS Managed Microsoft ADとAWS SSOを利用し、Google Workspaceにシングルサインオンする方法を紹介した。&lt;/p&gt;

&lt;p&gt;シングルサインオンをセットアップしただけなので、この時点ではユーザーの同期（プロビジョニング）は行われていない。つまり、AD側でユーザーを作成したり削除したりしたら、Google側でも同じ操作をしてあげなければならない。&lt;/p&gt;

&lt;p&gt;認証はシングルサインオンで行うのでパスワード管理を別々にする必要はないとしても、これじゃ大規模組織のユーザー管理は非現実的だ。なので、ユーザー同期もセットアップしてみる。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
GoogleはGoogle Cloud Directory Sync（GCDS）というツールを提供しているため、これを利用する。&lt;/p&gt;

&lt;p&gt;設定手順はこちらのGoogleのドキュメントの通りでOK。&lt;br&gt;
&lt;a href="https://cloud.google.com/architecture/identity/federating-gcp-with-active-directory-synchronizing-user-accounts"&gt;https://cloud.google.com/architecture/identity/federating-gcp-with-active-directory-synchronizing-user-accounts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;なお、単純に同期を設定する前に、当然ADとGoogleでは設計思想が異なるしユーザー同期においても色々と検討すべきことがある。かなり長いが、こちらの概要のドキュメントをしっかり読んでおくことをおすすめする。&lt;br&gt;
&lt;a href="https://cloud.google.com/architecture/identity/federating-gcp-with-active-directory-introduction"&gt;https://cloud.google.com/architecture/identity/federating-gcp-with-active-directory-introduction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
今回は、GCDS専用のEC2インスタンスをt2.mediumでたててそこにC\GCDSインストールした。ユーザー同期用に利用するAD側ユーザー（手順内では「gcds」）は特に管理者権限を与えなくても大丈夫だったので、AWS Managed ADでも特に問題なく利用できる。&lt;/p&gt;

&lt;p&gt;唯一Googleのドキュメントの手順に加えて要検討だったのは「ユーザーのプロビジョニング」→「ユーザー マッピングの構成」の中のユーザーの「Search Rule」だ。&lt;/p&gt;

&lt;p&gt;ここではBase DNを空にしているが、AWS Managed ADはゼロから構築したADとは少しOU構造が異なるので、内部システム用アカウント等を誤って拾わないように、Base DNはAWS Managed ADのユーザーに割り当てられたOUのDNを設定した。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wed64I8S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ew8nyo4caeqod8mrcvgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wed64I8S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ew8nyo4caeqod8mrcvgw.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;※今回は、NETBIOS名「CREATIVE」を指定しているので、DNは「OU=CREATIVE,DC=your-domain,DC=com」という感じになっている&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
DNの書き方が分からない人は、こういうやりかたで確認できる。&lt;/p&gt;

&lt;p&gt;Active Directory Users and Computersの管理画面から、Advanced Features（詳細設定）を表示させるよう設定する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VjD19fdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ao27p7rg2no36tb45sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VjD19fdI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ao27p7rg2no36tb45sw.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS Managed ADで管理されるOUがNETBIOS名で表示されているはずなので（この例では「CREATIVE」）、これを右クリックしてプロパティを表示。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jxarBGT_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lvxl6lfq6ai4hrz9lomn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jxarBGT_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lvxl6lfq6ai4hrz9lomn.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attribute Editorタブで、&lt;code&gt;distinguishedName&lt;/code&gt;を探して、その値を控えればそれがDNだ。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_2rQy-I9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ntg254egrqnj2kt9drka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_2rQy-I9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ntg254egrqnj2kt9drka.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
そんなこんなで、GCDSの設定も終わり、AD側で新たに作成したユーザーが問題なくGoogleにも作成されたことを確認できた。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oz1vNf8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uopkindmgnj58wv9acbe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oz1vNf8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uopkindmgnj58wv9acbe.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;あとはこれをまたドキュメントの手順通りに定期実行されるように設定すれば、自動化完了。&lt;/p&gt;

</description>
      <category>aws</category>
      <category>activedirectory</category>
      <category>google</category>
    </item>
    <item>
      <title>AWS Managed AD x AWS SSOでGoogle Workspaceにログインする</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Mon, 28 Jun 2021 02:38:18 +0000</pubDate>
      <link>https://dev.to/ryanch79/aws-managed-ad-x-aws-sso-google-workspace-2kf8</link>
      <guid>https://dev.to/ryanch79/aws-managed-ad-x-aws-sso-google-workspace-2kf8</guid>
      <description>&lt;p&gt;Google Workspace（旧G Suite）のアプリケーションを使いたいけど、ユーザー管理はActive Directoryで行いたいというケースもあるだろう。&lt;/p&gt;

&lt;p&gt;言い換えると、ADを認証プロバイダー（Identity Provider、IdPとも書く）として利用し、Google Workspaceをそれと連携するカスタムSAMLアプリケーションとして登録するということになる。&lt;/p&gt;

&lt;p&gt;ADFSをたてて連携させたり、ADのユーザーをGoogleと同期させる方法もあるようだがAWS Managed Microsoft AD（以下AWS Managed AD）を使っている場合は、少し面倒だ。前者はできると思うが、後者に関しては未確認。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
そこで、AWSのシングルサインオンサービスのAWS SSOを利用すればサーバーをたてて何かしらインストールする必要なく、その辺りのフェデレーションをやってくれるので楽に連携できる。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS Managed ADを構築していて、ちゃんと機能している&lt;/li&gt;
&lt;li&gt;AWS SSOを有効にさせてある（セットアップはしていなくても良い）
上記の2つのことを前提に、Google Workspaceとの連携をしてみるとする。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;なお、当たり前だが、しっかりユーザーのフェデレーションを行うためにはGoogle側のユーザーとADのユーザーは同じドメイン名を利用している必要がある。組織が持っているちゃんとしたパブリックドメインを利用するということだ（.localではだめなので、ADのドメインが.localならパブリックドメインでalternative UPNを追加しておくこと）。&lt;/p&gt;

&lt;p&gt;AWS Managed ADでは、パブリックドメインであっても.localであってもディレクトリを作成する際に検証がはしるということはないのだが、Google側はちゃんと自分が持っているドメインじゃないとカスタムドメインとして利用できないので注意。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
まずはAWS SSOの画面から、認証プロバイダーを設定する。&lt;/p&gt;

&lt;p&gt;Active DirectoryをIDのソースに指定した上で、ディレクトリの一覧から、正しいAWS Managed ADを選択する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kdQs_kAD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7l5vwaxn20n8koxnbr9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kdQs_kAD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7l5vwaxn20n8koxnbr9v.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;設定が完了すると、こんな状態になっているはず。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--om8tyvSG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yp03m56qnl5inx0zdmms.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--om8tyvSG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yp03m56qnl5inx0zdmms.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
次に、Googleのアプリケーションを追加する。&lt;/p&gt;

&lt;p&gt;左側ナビゲーションの「アプリケーション」を選択し、新規アプリケーションの追加からG Suiteを検索する。ここはまだ名前が更新されてなくて旧名称のG Suiteになっているのね。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UEE_xjG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qatuzleh0yfyyrovxzjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UEE_xjG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qatuzleh0yfyyrovxzjk.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;アプリケーションの追加時に、設定画面にていくつか情報を控える必要がある。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS SSO サインイン URL&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS SSO サインアウト URL&lt;br&gt;
をコピーしておいて、&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS SSO 証明書&lt;br&gt;
をダウンロードしておく。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JvgX70rM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fde4nfckwbjlcfuyahlu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JvgX70rM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fde4nfckwbjlcfuyahlu.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;他に、「アプリケーションのプロパティ」と「アプリケーションメタデータ」の設定が必要だが、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「アプリケーション開始 URL」：&lt;a href="https://www.google.com/a/"&gt;https://www.google.com/a/&lt;/a&gt;&amp;lt;自分のドメイン名&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;「アプリケーション SAML メタデータファイル*」は手動でのメタデータ入力に切り替えた上で、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「アプリケーション ACS URL*」：&lt;a href="https://www.google.com/a/"&gt;https://www.google.com/a/&lt;/a&gt;&amp;lt;自分のドメイン名&amp;gt;/acs&lt;/li&gt;
&lt;li&gt;「アプリケーション SAML 対象者*」：google.com/a/&amp;lt;自分のドメイン名&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;にそれぞれ設定する。何を設定するかを説明してくれるGoogleのヘルプページがあるが、ここでは省くとする。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1RRxgFIX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/862bv9g9ueblwltq8xsk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1RRxgFIX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/862bv9g9ueblwltq8xsk.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
次に、ちょっと作業場所を変えて今度はGoogle側でSSOの設定とユーザー作成を行う。&lt;/p&gt;

&lt;p&gt;組織の管理者としてGoogle Admin画面にログインし、セキュリティ→シングルサインオンの設定に進む。設定が2つあるが、&lt;/p&gt;

&lt;p&gt;「SAMLアプリケーションに対するシングルサインオン（SSO）の設定」は、今回とは逆のシナリオで使うものだ。つまり、Google側が認証プロバイダーとして、AWS管理コンソール等にログインしたい場合。&lt;/p&gt;

&lt;p&gt;「サードパーティの ID プロバイダを使用したシングル サインオン（SSO）の設定」が、今回使うものなので間違いのないように。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Eblgog3f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j6e2f57y119ii4lazy4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Eblgog3f--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j6e2f57y119ii4lazy4c.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;見ていただければもうお分かりだと思うが、先程AWS SSO側で控えた情報をこちらにセットする。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「ログインページのURL」：AWS SSO サインイン URL&lt;/li&gt;
&lt;li&gt;「ログアウトページのURL」：AWS SSO サインアウト URL&lt;/li&gt;
&lt;li&gt;「確認用の証明書」：AWS SSOからダウンロードした証明書&lt;/li&gt;
&lt;li&gt;「ドメイン固有の発行元を使用」：チェックを入れる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;設定が完了したら、保存を行う。&lt;/p&gt;

&lt;p&gt;次は、Google側のユーザーにADと同じメールアドレスのユーザーが存在していることを確認し、まだないのであれば作成しておく。&lt;/p&gt;

&lt;p&gt;※この例では、ユーザーの自動同期（プロビジョニング）は行っていない&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
再度AWS SSOに戻り、アプリケーションにユーザーの割当を行う。&lt;/p&gt;

&lt;p&gt;さきほど追加したアプリケーションの「割り当て済みユーザー」タブから、「ユーザーの割り当て」を選択し、アプリケーションを利用させたいユーザーやグループを割り当てる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rr49jF8v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wbfosoq89944b8nhpqn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rr49jF8v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wbfosoq89944b8nhpqn.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ここまで終わったら、直接AWS SSOのポータル画面からログインしてみる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_0kac7E8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36drl4tdckarm1e6hg4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_0kac7E8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36drl4tdckarm1e6hg4i.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;アプリケーション一覧に、ちゃんとG Suiteがある。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lwy9kxBy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3gm4xk78dmlhxh688tga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lwy9kxBy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3gm4xk78dmlhxh688tga.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;G Suiteのアイコンを選択すると、ちゃんとシングルサインオンできた。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AdE00rz---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0uyem1u6f7ok4073s08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AdE00rz---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0uyem1u6f7ok4073s08.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>activedirectory</category>
      <category>google</category>
      <category>singlesignon</category>
    </item>
    <item>
      <title>Systems Manager Run CommandでAWS Managed Microsoft ADを操作する</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Tue, 11 May 2021 03:06:20 +0000</pubDate>
      <link>https://dev.to/ryanch79/systems-manager-run-command-aws-managed-microsoft-ad-49kh</link>
      <guid>https://dev.to/ryanch79/systems-manager-run-command-aws-managed-microsoft-ad-49kh</guid>
      <description>&lt;p&gt;AWS Managed Microsoft AD（以下Managed AD）を管理するには、リモート管理ツールをインストールした管理用サーバー（または踏み台サーバー）が別途必要なのが世の常だが。。オペレーションを自動化したい、またはサーバーにリモートデスクトップすることなくPowerShellコマンドレットを実行してぱぱっとやっちゃいたい、と思うこともあるだろう。&lt;/p&gt;

&lt;p&gt;そう、まさにSystems Manager Run Commandで普通のWindows Server EC2インスタンスに対してできるように。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ただ、これにはハードルが2つある。&lt;/p&gt;

&lt;p&gt;①Managed ADのドメインコントローラーはEC2インスタンスじゃないので、Run Commandのターゲットに指定できない&lt;/p&gt;

&lt;p&gt;②Run Commandはインスタンスのローカルシステムアカウントとして実行されるのだが、ドメインコントローラーに対する操作はそれなりの権限を持った「ドメインユーザー」として実行する必要がある&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
①に関しては、直接ドメインコントローラーに対してではなく、同じドメインに属している別のEC2インスタンスに対して実行し、そのコマンド自体がドメインコントローラーに対して操作を実行するという構図にしよう。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;結局踏み台必要じゃないか！&lt;/code&gt;&lt;br&gt;
というツッコミは華麗にスルーして、「でもリモートデスクトップする必要はないし、Run Commandが実行できる条件さえ整っていればどのサーバーでもいいよ」とつぶやいてみる。&lt;/p&gt;

&lt;p&gt;ちなみに、PowerShell CoreをLambda関数に載せて完全にサーバーレスでできたら美しいだろうな。。しかしAD関連をPowerShell Coreでやるのはかなりややこしくなるのでここでは原始的に踏み台サーバーを使うとしよう。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
②に関しては、実行したいコマンドレットに依存するが、別のユーザーとして実行する機能を活用する。詳しくは実際の実行サンプルにて。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
用意するもの：&lt;br&gt;
a. ドメインユーザーの認証情報を保存したSecrets Managerシークレット&lt;/p&gt;

&lt;p&gt;b. Secrets Managerシークレットを参照できるEC2インスタンスプロファイル&lt;/p&gt;

&lt;p&gt;c. Systems Manager Run Commandを実行でき、かつManaged ADのドメインに参加しているWindows ServerのEC2インスタンス&lt;/p&gt;

&lt;p&gt;d. Systems Manager Run Commandドキュメント&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
a.とb.は、&lt;a href="https://dev.to/ryanch79/ec2-ad-userdata-19k6"&gt;この投稿&lt;/a&gt;と作成の仕方は同じなのでどうぞご参考に。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
c.は各自調達しましょうね。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
d.を次のように作成してみた。&lt;/p&gt;

&lt;p&gt;今回は、ちょっとややこしいDNSフォワーダ設定をしてみるとしよう。&lt;/p&gt;

&lt;p&gt;柔軟性のあるドキュメントにしたいので、パラメータを次のように設ける。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DomainController1: DNSサーバーのIPアドレス（その一）&lt;/li&gt;
&lt;li&gt;DomainController2: DNSサーバーのIPアドレス（その二）&lt;/li&gt;
&lt;li&gt;DNSForwardDestination: DNSフォワード先のIPアドレス&lt;/li&gt;
&lt;li&gt;UserCredentialSecretID: ドメインユーザーの認証情報が格納されているSecrets ManagerシークレットのID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Managed ADのDNSサーバーはドメインコントローラー上にあるので、Directory Serviceの管理コンソールからIPアドレスを確認できる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9bfbkic9j6ody8wbn80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9bfbkic9j6ody8wbn80.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;以下、Run Commandドキュメント。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
schemaVersion: "2.2"
description: "Overwrites DNS Forwarder settings"
parameters:
  DomainController1:
    type: String
    description: "コマンド実行する対象のDNSサーバーのIPアドレス（その一）"
  DomainController2:
    type: String
    description: "コマンド実行する対象のDNSサーバーのIPアドレス（その二）"
  DNSForwardDestination:
    type: String
    description: "設定したいDNSのフォワード先IPアドレス"
  UserCredentialSecretID:
    type: String
    description: "AD参加に利用するユーザー認証情報を保持するSecrets ManagerシークレットID"
mainSteps:
- action: "aws:runPowerShellScript"
  name: "addDnsForwarder"
  inputs:
    runCommand: 
    - $secretManager = Get-SECSecretValue -SecretId "{{UserCredentialSecretID}}"
    - $secret = $secretManager.SecretString | ConvertFrom-Json
    - $username = $secret.Username
    - $password = $secret.Password | ConvertTo-SecureString -AsPlainText -Force
    - $credential = New-Object System.Management.Automation.PSCredential($username,$password)
    - $cimsession = New-CimSession -Credential $credential
    - Write-Output "Overwriting DNS Forwarder setting  ----"
    - Add-DnsServerForwarder -CimSession $cimsession -ComputerName {{DomainController1}} -IpAddress {{DNSForwardDestination}} -PassThru
    - Add-DnsServerForwarder -CimSession $cimsession -ComputerName {{DomainController2}} -IpAddress {{DNSForwardDestination}} -PassThru
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
各パラメータをうまく当てはめて、PowerShellで&lt;code&gt;Add-DnsServerForwarder&lt;/code&gt;コマンドレットを実行するだけ。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
実際にこのドキュメントをRun Commandで実行してみて、問題なくDNSフォワーダの設定が入ったことを確認。よかった。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo09yfxs6cjo2hrn02343.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo09yfxs6cjo2hrn02343.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ドキュメントにしてしまえば、EventBridgeで定期実行するとか、アドホックでAWSコンソールから実行するとかもできるので、サーバーにログインする必要がなくなり便利だしセキュリティも向上する。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ちなみに、ここでポイントになるのが&lt;code&gt;Add-DnsServerForwarder&lt;/code&gt;を「ドメインユーザー」として実行できるかという話。&lt;/p&gt;

&lt;p&gt;このコマンドレットは&lt;code&gt;-CimSession&lt;/code&gt;スイッチがあるので、他のユーザーとしてのセッションとして実行することができる。他にも&lt;code&gt;-Credential&lt;/code&gt;等のスイッチを持っているコマンドレットならできるが。。そういったスイッチを持っていないコマンドレットだと一気にややこしくなる。&lt;/p&gt;

&lt;p&gt;ということで今日は以上。&lt;/p&gt;

</description>
      <category>aws</category>
      <category>windows</category>
      <category>activedirectory</category>
      <category>dns</category>
    </item>
    <item>
      <title>EC2インスタンス作成時にホスト名変更＆AD参加する（RunCommand編）</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Wed, 21 Apr 2021 02:03:30 +0000</pubDate>
      <link>https://dev.to/ryanch79/ec2-ad-runcommand-1b70</link>
      <guid>https://dev.to/ryanch79/ec2-ad-runcommand-1b70</guid>
      <description>&lt;p&gt;前回の&lt;a href="https://dev.to/ryanch79/ec2-ad-userdata-19k6"&gt;UserData編&lt;/a&gt;に続き、達成したい目的は同じく下記のままで、&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;①（AWS Managed ADではない）ADに参加&lt;br&gt;
②ホスト名を、自分がつけたNameタグの値に揃える&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;やり方をUserDataではなくもうちょっと柔軟なSystems Manager RunCommandを利用する方法を試していこうと思う。&lt;/p&gt;

&lt;p&gt;Systems Managerを利用すると、もちろんできることの幅は非常に広がるのだが、その代わりSSMエージェントのインストールとインスタンスプロファイルの設定等、必要条件を満たす必要はある（Amazon提供のAMIならエージェントは最初から入っているので楽）。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
インスタンスプロファイルに必要なIAM権限と、シークレットマネージャーへのADユーザー認証情報の登録等は前回同様なので省略する。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Systems Managerの「ドキュメント」を開き、「Create Document」から&lt;code&gt;Command or session&lt;/code&gt;タイプを選択する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BT2yq9ph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jl3us2enbudh8b9czni.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BT2yq9ph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jl3us2enbudh8b9czni.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ドキュメントの詳細はこんな感じで作成する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4LwK1uJv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkfbiusqu4yu01wyj8r4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4LwK1uJv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkfbiusqu4yu01wyj8r4.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ドキュメントタイプは&lt;code&gt;コマンドドキュメント&lt;/code&gt;になる。 &lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
肝心なコマンドのコンテンツだが、前回のPowerShellスクリプトをそのまま流用して、大事そうなパラメータが指定できるようにだけ少し手を入れてYAML形式にしてみた。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
schemaVersion: "2.2"
description: "Join AD and rename host with instance tag"
parameters:
  DomainName:
    type: "String"
    description: "参加するADドメインのDNS名"
  UserCredentialSecretID:
    type: "String"
    description: "AD参加に利用するユーザー認証情報を保持するSecrets ManagerシークレットID"
  HostnameTag:
    type: "String"
    description: "ホスト名を定義するタグ名（デフォルトはName）"
    default: "Name"
mainSteps:
- action: "aws:runPowerShellScript"
  name: "example"
  inputs:
    runCommand:
    - $secretManager = Get-SECSecretValue -SecretId {{UserCredentialSecretID}}
    - $secret = $secretManager.SecretString | ConvertFrom-Json
    - $username = $domainName + "\" + $secret.Account
    - $password = $secret.Password | ConvertTo-SecureString -AsPlainText -Force
    - $credential = New-Object System.Management.Automation.PSCredential($username,$password)
    - $instanceID = Get-EC2InstanceMetadata -Category InstanceId
    - $nameTag = Get-EC2Tag -Filter @{Name="resource-id";Value="$instanceID"},@{Name="key";Value="{{HostnameTag}}"}
    - $newName = $nameTag.Value
    - Add-Computer -DomainName "{{DomainName}}" -NewName "$newName" -Credential $credential -Passthru -Force -Restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;（パラメータ値は&lt;code&gt;{{}}&lt;/code&gt;で囲む）&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
これで実際にRun Commandで実行する際には、こんな感じでパラメータを指定できるしEC2インスタンスの初回起動時じゃなくてもいつでも実行でき、たくさんのインスタンスに対しても一気に実行できるので一気に柔軟性が増す。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HnuN1U4R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ze84k5ua72uyub85thti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HnuN1U4R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ze84k5ua72uyub85thti.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;一々パラメータ設定が面倒であれば、デフォルト値をセットしてしまえば良し。&lt;/p&gt;

&lt;p&gt;&lt;br&gt; &lt;br&gt;
実際にやってみたが問題なく動作した。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CnuMEdif--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s6v5eukz9bcyz8xf8tay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CnuMEdif--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s6v5eukz9bcyz8xf8tay.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;今回は以上。次Chef好き向けにOpsWorksでやってみようかと思う。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
※イラストはこちらからご提供いただきました：&lt;br&gt;
&lt;a href="https://www.freepik.com/vectors/computer"&gt;Computer vector created by macrovector - &lt;/a&gt;&lt;a href="http://www.freepik.com"&gt;www.freepik.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>windows</category>
      <category>ec2</category>
      <category>activedirectory</category>
    </item>
    <item>
      <title>EC2インスタンス作成時にホスト名変更＆AD参加する（UserData編）</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Mon, 19 Apr 2021 13:18:48 +0000</pubDate>
      <link>https://dev.to/ryanch79/ec2-ad-userdata-19k6</link>
      <guid>https://dev.to/ryanch79/ec2-ad-userdata-19k6</guid>
      <description>&lt;p&gt;検証環境でWindows Serverをたくさんたてるのだが、&lt;br&gt;
①（AWS Managed ADではない）ADに参加&lt;br&gt;
②ホスト名を、自分がつけたNameタグの値に揃える&lt;br&gt;
これはだいたい必ずやる。②に関しては、自動的につけられるランダムなホスト名だと分かりづらいので早々に自分がつけたい名前にしておきたいという意図。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
これを一々手動でやるのはとても面倒なので（再起動も発生するし）、もちろん自動化したい。自動化する方法は色々あるが、今回は一番原始的（？）UserDataスクリプトを利用する方法を使ってみる。&lt;/p&gt;

&lt;p&gt;ちなみにUserDataスクリプトはインスタンス作成時の一回しか実行されないので、少々柔軟性にかけるし、何かしらの問題でスクリプト実行が失敗したら手動で直さないといけない。とはいえアドホックでやるには簡単な方法だし楽な場合もある。&lt;/p&gt;

&lt;p&gt;AWS Managed ADを使う場合は、インスタンス作成時に簡単に指定できちゃうのだが、EC2上に構築したADや、オンプレのAD等の場合はこういう方法を使う必要がある。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ドメイン参加にはその権限を持ったドメインアカウントが必要なのだが、その認証情報をスクリプトにハードコードしたくはないのでSecrets Managerを使うとしよう。&lt;/p&gt;

&lt;p&gt;「その他シークレット」のタイプで作成。&lt;br&gt;
参加するドメインは&lt;code&gt;onprem.example.com&lt;/code&gt;という設定だ。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepbervqypq4rcsvq10n7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepbervqypq4rcsvq10n7.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;こんな感じでドメインアカウントのユーザー名とパスワードを設定しておく（もちろん、コンピュータをドメイン参加させる権限のあるアカウントを使ってね）。 &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh551iospq3not6ty3sif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh551iospq3not6ty3sif.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;onprem.example.com/DomainJoin&lt;/code&gt;という名前でシークレットを作成した。 &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fne6ktw8q2wb4fwb0nhov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fne6ktw8q2wb4fwb0nhov.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ここから先は、EC2インスタンスプロファイル（IAMロール）にこの2つの権限が必要になってくる。&lt;br&gt;
①さきほど作成したシークレット&lt;code&gt;onprem.example.com/DomainJoin&lt;/code&gt;を読み取る権限&lt;br&gt;
②EC2のタグを読み取る権限（Nameタグの値を読み取って、ホスト名に使う必要があるので）&lt;/p&gt;

&lt;p&gt;こんな感じのポリシーを最低限追加しておく必要あり。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Statement": [
        {
            "Sid": "ReadTag",
            "Effect": "Allow",
            "Action": "ec2:DescribeTags",
            "Resource": "*"
        },
        {
            "Sid": "SecretsMgrRead",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:&amp;lt;リージョン&amp;gt;:&amp;lt;AWSアカウント番号&amp;gt;:secret:onprem.example.com/DomainJoin-tewFSS"
        }
    ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;secretsmanager:GetSecretValue&lt;/code&gt;アクションの権限で指定する&lt;code&gt;Resource&lt;/code&gt;の値は、さきほど作成したシークレットのARNを代入する。Secrets Managerで簡単に確認できる。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n2g6nzp67d3fwmrjzwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n2g6nzp67d3fwmrjzwb.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
これで準備が揃ったので、こういうスクリプトをUserDataに貼り付けて、Windows ServerのEC2インスタンスをたてる。&lt;br&gt;
※AWS Tools for PowerShellを使うので、Amazonが提供する標準Windows ServerのAMIを使っていることを想定。自前のAMIを使うのであれば、AWS Tools for PowerShellをイメージにあらかじめ入れておく必要あり。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;powershell&amp;gt;
# ドメイン名とシークレット名を定義
$domainName = "onprem.example.com"
$secretName = "onprem.example.com/DomainJoin"

# シークレットの値をとってくる
$secretManager = Get-SECSecretValue -SecretId $secretName

# シークレットの値をオブジェクトに入れる
$secret = $secretManager.SecretString | ConvertFrom-Json

# ドメイン参加用認証情報を作成
$username = $domainName + "\" + $secret.Account
$password = $secret.Password | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($username,$password)

# EC2インスタンスメタデータからインスタンスIDを取得し、続けてNameタグを取得
$instanceID = Get-EC2InstanceMetadata -Category InstanceId
$nameTag = Get-EC2Tag -Filter @{Name="resource-id";Value="$instanceID"},@{Name="key";Value="Name"}
$newName = $nameTag.Value

# ドメイン参加を実施
Add-Computer -DomainName "$domainName" -NewName "$newName" -Credential $credential -Passthru -Force -Restart
&amp;lt;/powershell&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
これで、EC2インスタンス作成と同時にドメイン参加・ホスト名変更までできた。ローカルアドミンのパスワードを一度も復号化する必要なくドメインアカウントでログインできるので便利。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ちなみに、ドメイン参加のためにはドメインコントローラーを名前解決できる必要があるので、&lt;br&gt;
①Route 53 Resolverのアウトバウンドエンドポイントを作成し、ルールでADドメインの名前は、ADのDNSサーバーにルーティングさせる&lt;br&gt;
②DHCPオプションセットを設定しておく&lt;br&gt;
③UserDataスクリプトに、DNS設定をADに向けるように設定する操作を追加する&lt;br&gt;
のどれかをする必要はある（他にも方法あるかも）。&lt;br&gt;
私の場合は、①を設定しているので他の設定は特に不要。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
次回にはSystems Manager Automationを使う方法かChefを使う方法を試そうかなと思う。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
※イラストはこちらからご提供いただきました：&lt;br&gt;
&lt;a href="https://www.freepik.com/vectors/computer" rel="noopener noreferrer"&gt;Computer vector created by macrovector - &lt;/a&gt;&lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;www.freepik.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>windows</category>
      <category>ec2</category>
      <category>activedirectory</category>
    </item>
    <item>
      <title>CloudWatch LogsでWindows Defenderのログを収集する</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Fri, 16 Apr 2021 06:47:42 +0000</pubDate>
      <link>https://dev.to/ryanch79/cloudwatch-logs-windows-defender-i9e</link>
      <guid>https://dev.to/ryanch79/cloudwatch-logs-windows-defender-i9e</guid>
      <description>&lt;p&gt;Amazon CloudWatch LogsにCloudWatch統合エージェントをインストールしてイベントログを収集する方法は、公式ドキュメントやその他ブログ記事もたくさんあり、そのまま従えば良いのだが、一番よくあるSystem、Application、Securityのログ以外にちょっとマニアックなもの（今回はWindows Defender）のイベントログをとるには、エージェントのconfigはどう書けばいいのか質問を受けたことがある。&lt;/p&gt;

&lt;p&gt;まあ色々試せば誰でも発見できると思うが、あまり記事も見かけないし忙しい人達が自分で試す手間も減らしたいので、共有しようと思う。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
configに使う&lt;code&gt;event_name&lt;/code&gt;が、SystemやSecurityだとそれぞれそのまま記載すればいいのだが、それ以外のマイナーなイベントログだと何を指定するか知る必要がある。その確認方法は下記の通り。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Windows Serverで、&lt;code&gt;compmgmt.msc&lt;/code&gt;を実行し、イベントビューアを展開する。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsxmyjraxdjp5nqceynp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsxmyjraxdjp5nqceynp.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Windows Defenderのログは、Applications and Services Logs → Microsoft → Windows配下にある。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfpa56m19vbi97cek2f5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdfpa56m19vbi97cek2f5.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
あった。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxc01hbcyjwauo12u9jp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxc01hbcyjwauo12u9jp.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
右側のペインの&lt;code&gt;Operational&lt;/code&gt;を右クリックし、プロパティを表示する。基本的にこのOperationalログが必要なもののようだ。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwpw40qhpjiytlteodwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwpw40qhpjiytlteodwy.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
プロパティウィンドウで表示されている&lt;code&gt;Full Name&lt;/code&gt;が、必要な&lt;code&gt;event_name&lt;/code&gt;に相当するので、これをコピーする。この場合は&lt;code&gt;Microsoft-Windows-Windows Defender/Operational&lt;/code&gt;だった。&lt;/p&gt;

&lt;p&gt;つまり、CloudWatchのconfigの中でこのイベントログの拾い方の定義は下記のように記述すれば良い。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
"event_format": "xml",
"event_levels": [
"INFORMATION",
"WARNING",
"ERROR",
"CRITICAL"
],
"event_name": "Microsoft-Windows-Windows Defender/Operational",
"log_group_name": "WindowsDefender",
"log_stream_name": "{instance_id}"
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;br&gt;&lt;br&gt;
例えばEvent ID 5007でフィルターしたい、という場合はCloudWatch Logsのフィルターパターンで下記のようにパターン定義すれば良いということになる。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffum1s7sbyw3n46r2e8i8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffum1s7sbyw3n46r2e8i8.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
問題なくWindows DefenderのログがCloudWatch Logsに連携されていることを確認した。&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vth1zurknxv6en63eg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vth1zurknxv6en63eg3.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
こんな感じで、どんなWindowsイベントログでもCloudWatchに連携できるはず！&lt;/p&gt;

</description>
      <category>aws</category>
      <category>windows</category>
      <category>cloudwatch</category>
      <category>defender</category>
    </item>
    <item>
      <title>Amazon FSx for Windows File Serverで隠し共有フォルダを作る</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Thu, 15 Apr 2021 13:30:21 +0000</pubDate>
      <link>https://dev.to/ryanch79/amazon-fsx-for-windows-file-server-jgb</link>
      <guid>https://dev.to/ryanch79/amazon-fsx-for-windows-file-server-jgb</guid>
      <description>&lt;p&gt;Windowsのファイルサーバーで隠し共有フォルダを作ることは簡単だ。Amazon FSx for Windows File Serverでもできないわけがない。うん。&lt;br&gt;
でもまだしたことがなかったので、一応試してみた。&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
まずAWS管理コンソールから、FSxファイルシステムのDNS名を確認する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B8VaWA-Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gxi110s5kh3br2jafc4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B8VaWA-Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gxi110s5kh3br2jafc4x.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
そして同じADに所属しているWindows Serverから&lt;code&gt;fsmgmt.msc&lt;/code&gt;を起動する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qvcZpEdH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrr7qn8a9i6zl6ek4ex7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qvcZpEdH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vrr7qn8a9i6zl6ek4ex7.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
「操作」→「別のコンピューター」を選んで、FSxファイルシステムのDNSの名を入力する。&lt;/p&gt;

&lt;p&gt;ちゃんと権限を持っているユーザーであれば、接続して現在の共有フォルダの一覧を確認できる。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bOkGH6Ro--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3nvopcl4rrps0owk04hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bOkGH6Ro--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3nvopcl4rrps0owk04hy.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
次に、共有フォルダ用のファイルを格納するための物理フォルダを新たに確保するとしよう。&lt;code&gt;secret&lt;/code&gt;と名付けたフォルダを&lt;code&gt;D:\&lt;/code&gt;直下に作る。&lt;br&gt;
これは、普通に&lt;code&gt;\\FSxのDNS名\D$&lt;/code&gt;でD:\のウィンドウを開き、その下に新規フォルダを作れば良い（もちろんコマンドプロンプトかPowerShellで、フルパスを指定してmkdirかNew-Itemしても良い）。&lt;/p&gt;

&lt;p&gt;前から使っていた&lt;code&gt;share&lt;/code&gt;と&lt;code&gt;share2&lt;/code&gt;に加えて&lt;code&gt;secret&lt;/code&gt;を作った。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eBreFPIj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qmsm7erkrcxtmjnmfw8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eBreFPIj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qmsm7erkrcxtmjnmfw8e.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ではfsmgmt.mscに戻って、メニューから「操作」→「新しい共有」を選ぶ。&lt;/p&gt;

&lt;p&gt;共有フォルダ作成のウィザードの2ページ目で、さきほど新たに作成した&lt;code&gt;D:\secret&lt;/code&gt;フォルダを指定する&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GsxXQSDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jpavmbe0x1t1ns6gizpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GsxXQSDv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jpavmbe0x1t1ns6gizpj.png" alt="image"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
次のページで、共有名の最後に「$」をつける。隠しフォルダにするためにこれが必ず必要。今回は無難に&lt;code&gt;secret$&lt;/code&gt;と名付けた。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DmZGyKWV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ftqsx0qc93yrfdbskeqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DmZGyKWV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ftqsx0qc93yrfdbskeqx.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
アクセス許可を適切に設定して、完了すればOK。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Vb6bYX64--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o8vcekpuw30vgo2pg3jl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Vb6bYX64--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o8vcekpuw30vgo2pg3jl.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
アクセス権限がある場合でも、普段はDNS名だけでアクセスすると一覧が表示されてしまう共有フォルダが、隠し仕様だと表示されない。明示的に共有名を知っていてパスをアクセスした場合のみアクセスできる。&lt;/p&gt;

&lt;p&gt;secret$は表示されない。。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--75-_VZQG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yzxocag73p3e3gdk6gbn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--75-_VZQG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yzxocag73p3e3gdk6gbn.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
でも直パスでアクセスすると、ちゃんと使える。&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MyW2Utr4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/alwree43enhtf0hfgh8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MyW2Utr4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/alwree43enhtf0hfgh8i.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
ちなみに、共有フォルダの「共有のアクセス許可」と「セキュリティ」両方の設定で許可されていなければ、ユーザーはアクセスできないので注意。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XWsgTSqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trs3rw3qpo9dh7b9qgz5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XWsgTSqF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/trs3rw3qpo9dh7b9qgz5.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;やはりFSx for Windows File Serverでも問題なく隠し共有フォルダを作成して利用できた。 &lt;/p&gt;

</description>
      <category>aws</category>
      <category>windows</category>
      <category>fileshare</category>
    </item>
    <item>
      <title>SharePoint OnlineのデータをAWSに同期/移行/コピーする</title>
      <dc:creator>ryanc</dc:creator>
      <pubDate>Tue, 16 Mar 2021 09:43:09 +0000</pubDate>
      <link>https://dev.to/ryanch79/sharepoint-online-aws-13b1</link>
      <guid>https://dev.to/ryanch79/sharepoint-online-aws-13b1</guid>
      <description>&lt;p&gt;SharePoint Online上のアプリケーションによって書き込まれるリストデータと、ドキュメントライブラリに保存されるファイルをAWSに同期するという要件があり、久しぶりにSharePoint Onlineからのデータエクスポート方法やらPowerShellコマンドレットやらを調べた。&lt;/p&gt;

&lt;p&gt;SharePointに馴染みのない方のために超ざっくりした説明をつけると、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;リスト：RDBでいうテーブル。データ型を指定したカラムで構成されたデータが行単位で並ぶ。バックエンドはSQL Serverのテーブル&lt;/li&gt;
&lt;li&gt;ライブラリ：階層化された共有フォルダみたいなもので、どんどんファイルを入れていくところ。アクセス権限やバージョン管理ができる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TestSiteというSharePointサイトにTestListというリストとTestLibraryというライブラリを作った（ネーミングセンスはご容赦ください）。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmg44sn9sc6itb5dp5jo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmg44sn9sc6itb5dp5jo.png" alt="image" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgt6jy7pc6fk20ocat3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzgt6jy7pc6fk20ocat3s.png" alt="image" width="800" height="308"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;AWS Toolsも使いやすいので、全体的にPowerShellでやっていく。&lt;br&gt;
SharePoint Onlineからデータを取得するのに使うライブラリには主にCSOMとPnPがあるが、PnPの方が新しく、使いやすい。&lt;br&gt;
[&lt;a href="https://docs.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-pnp/sharepoint-pnp-cmdlets?view=sharepoint-ps" rel="noopener noreferrer"&gt;https://docs.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-pnp/sharepoint-pnp-cmdlets?view=sharepoint-ps&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;データ同期バッチを動かすためのWindows Serverが既にEC2上にあったので、そこで作業する。&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;まずPnPモジュールをインストールしておく。&lt;br&gt;
&lt;code&gt;Install-Module -Name PnP.PowerShell&lt;/code&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  リストデータのエクスポート
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnl9q5dhptkkeiqgbcab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdnl9q5dhptkkeiqgbcab.png" alt="image" width="632" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;こんな感じのコードで、SharePoint Onlineに接続しローカルにデータをダウンロードできる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# SharePointへのアクセス情報
$userName = "&amp;lt;データにアクセスできるユーザー@hogehoge.onmicrosoft.com&amp;gt;"
$userPassword = "&amp;lt;パスワード&amp;gt;"

$siteURL = "https://hogehoge.sharepoint.com/sites/TestSite/"
$secPasswd = ConvertTo-SecureString $userPassword -AsPlainText -Force

[System.Management.Automation.PSCredential]$PSCredentials = New-Object System.Management.Automation.PSCredential($userName, $secPasswd)

# PnPでSharePoint Onlineに接続する
Connect-PnPOnline -Url $siteURL -Credentials $PSCredentials

# リストのデータを取得する
$listName = "TestList"
$selectedFields = @("Title","Age", "Occupation")
$CSVPath = "C:\work\SPOnline\PnPListData.csv"

$listItems = Get-PnPListItem -List $listName -Fields $selectedFields -PageSize 500

# 取得したオブジェクト型データをイタレートしながら処理する
$listDataColl = @()
$listItems | ForEach-Object {
    $listData = New-Object PSObject
    $listItem  = Get-PnPProperty -ClientObject $_ -Property FieldValuesAsText
    ForEach($Field in $selectedFields)
    {
        $listData | Add-Member Noteproperty $Field $listItem[$Field]
    } 
    $listDataColl += $listData 
}
$listDataColl | Export-CSV $CSVPath -NoTypeInformation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで「C:\work\SPOnline\PnPListData.csv」にCSV形式でTestListの中身がエクスポートされる。CSVに吐かずとも、その場で色々処理したりすることももちろん可能。やろうと思えばそのままDynamoDBかRDSに挿入できる（ちょっとパフォーマンスが心配だが）。&lt;/p&gt;

&lt;p&gt;ちゃんとCSVにエクスポートできた。&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F39hf4muspugx28ggo4id.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F39hf4muspugx28ggo4id.png" alt="image" width="270" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  ライブラリファイルのエクスポート
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ror6axeexg08sbjkau3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7ror6axeexg08sbjkau3.png" alt="image" width="635" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;「PnPでSharePoint Onlineに接続する」の「Connect-PnPOnline」までは同じで、残りは次のようなコードでファイルをダウンロードする。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ファイルの取得元ライブラリを指定
$folderSiteRelativeURL = "/TestLibrary"
$destinationFolder ="C:\work\SPOnline\PnP"

$Folder = Get-PnPFolder -Url $FolderSiteRelativeURL
$FolderURL = $Folder.ServerRelativeUrl.Substring($Folder.Context.Web.ServerRelativeUrl.Length)
$localFolder = $destinationFolder + ($FolderURL -replace "/","\")

# 取得したオブジェクト型データをイタレートしながら処理する
$filesColl = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderURL -ItemType File
Foreach($File in $filesColl)
    {
        Get-PnPFile -ServerRelativeUrl $File.ServerRelativeUrl -Path $localFolder -FileName $File.Name -AsFile -force
        Write-host -f Green "`tDownloaded File from '$($File.ServerRelativeUrl)'"
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ちゃんとダウンロードできた。&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvzbxgbcgha4lt3iaxzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvvzbxgbcgha4lt3iaxzp.png" alt="image" width="420" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この後は普通にAWS Tools for PowerShellを使って&lt;code&gt;Write-S3Object&lt;/code&gt;なりすればOK。&lt;/p&gt;

&lt;p&gt;EC2だとインスタンスプロファイル（IAMロール）を付与しておけば、S3にデータをPUTするためにアクセスキーとシークレットキーを生成しなくて良い点がプラス。&lt;/p&gt;

&lt;p&gt;SharePoint側はユーザー名・パスワードを使っちゃっているが、ここもSecrets Managerを使うなりでハードコードを避けるか、そもそもパスワード認証以外にしたいところ。ここではその深堀りは割愛する。&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  rcloneを使ってみる
&lt;/h3&gt;

&lt;p&gt;もう一つこんなごりごりスクリプト書かずに、何やら人気の高いOSSであるrcloneを使う方法もある。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rclone.org/" rel="noopener noreferrer"&gt;https://rclone.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;rcloneは色んなデータソースをサポートしていて、その中にはもちろんS3とSharePointもある。SharePoint OnlineのライブラリのバックエンドはどうやらOneDriveらしいので、OneDriveを選択すればOK。&lt;/p&gt;

&lt;p&gt;rcloneをインストールしたら、設定でremoteを2つ作成する。&lt;br&gt;
2つのリモート拠点を定義し、それらの間で（どっちの方向も可）コピーや同期ができるという概念。&lt;/p&gt;

&lt;p&gt;S3向けには、4番の「Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM CO」を選ぶ。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.\rclone config

e) Edit existing remote      
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q&amp;gt; n
name&amp;gt; S3
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / 1Fichier
   \ "fichier"
 2 / Alias for an existing remote
   \ "alias"
 3 / Amazon Drive
   \ "amazon cloud drive"
 4 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM CO
S, Minio, and Tencent COS
   \ "s3"
~~~中略~~~
Storage&amp;gt; 4
** See help for s3 backend at: https://rclone.org/s3/ **

Choose your S3 provider.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
 1 / Amazon Web Services (AWS) S3
   \ "AWS"
 2 / Alibaba Cloud Object Storage System (OSS) formerly Aliyun
   \ "Alibaba"
 3 / Ceph Object Storage
   \ "Ceph"
 4 / Digital Ocean Spaces
   \ "DigitalOcean"
 5 / Dreamhost DreamObjects
   \ "Dreamhost"
 6 / IBM COS S3
   \ "IBMCOS"
 7 / Minio Object Storage
   \ "Minio"
 8 / Netease Object Storage (NOS)
   \ "Netease"
 9 / Scaleway Object Storage
   \ "Scaleway"
10 / StackPath Object Storage
   \ "StackPath"
11 / Tencent Cloud Object Storage (COS)
   \ "TencentCOS"
12 / Wasabi Object Storage
   \ "Wasabi"
13 / Any other S3 compatible provider
   \ "Other"
provider&amp;gt;     1
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
Only applies if access_key_id and secret_access_key is blank.
Enter a boolean value (true or false). Press Enter for the default ("false").
Choose a number from below, or type in your own value
 1 / Enter AWS credentials in the next step
   \ "false"
 2 / Get AWS credentials from the environment (env vars or IAM)
   \ "true"
env_auth&amp;gt;     2
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
access_key_id&amp;gt;
AWS Secret Access Key (password)
Leave blank for anonymous access or runtime credentials.
Enter a string value. Press Enter for the default ("").
secret_access_key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;元々サーバー上にcredentialの環境設定があれば、ここで改めてアクセスキーを入力する必要はない（しない方が、コンフィグに書き込まれないので良い）。&lt;/p&gt;

&lt;p&gt;以降はリージョンを選んだりと、難しいポイントは無し。&lt;/p&gt;

&lt;p&gt;SharePoint Onlineの方は、26番の「Microsoft OneDrive」を選択する。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q&amp;gt; n
name&amp;gt; SP-Online  
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
~~~中略~~~
26 / Microsoft OneDrive
   \ "onedrive"
27 / OpenDrive
   \ "opendrive"
28 / OpenStack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
29 / Pcloud
   \ "pcloud"
30 / Put.io
   \ "putio"
31 / QingCloud Object Storage
   \ "qingstor"
32 / SSH/SFTP Connection
   \ "sftp"
33 / Sugarsync
   \ "sugarsync"
34 / Tardigrade Decentralized Cloud Storage
   \ "tardigrade"
35 / Transparently chunk/split large files
   \ "chunker"
36 / Union merges the contents of several upstream fs
   \ "union"
37 / Webdav
   \ "webdav"
38 / Yandex Disk
   \ "yandex"
39 / Zoho
   \ "zoho"
         40 / http Connection
   \ "http"
41 / premiumize.me
   \ "premiumizeme"
42 / seafile
   \ "seafile"
Storage&amp;gt;     26
** See help for onedrive backend at: https://rclone.org/onedrive/ **

OAuth Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id&amp;gt;
OAuth Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret&amp;gt;
Choose national cloud region for OneDrive.
Enter a string value. Press Enter for the default ("global").
Choose a number from below, or type in your own value
 1 / Microsoft Cloud Global
   \ "global"
 2 / Microsoft Cloud for US Government
   \ "us"
 3 / Microsoft Cloud Germany
   \ "de"
 4 / Azure and Office 365 operated by 21Vianet in China
   \ "cn"
region&amp;gt;     1
Edit advanced config? (y/n)
y) Yes
n) No (default)
y/n&amp;gt;
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes (default)
n) No
y/n&amp;gt; y
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=Be1GkMEtURoIXTTAF5jgXA
Log in and authorize rclone for access
Waiting for code...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;「auto config」を利用すると認証が非常に便利に済むので、OAuth Client IdやOAuth Client Secretを入力する必要はない（ブランクのまま、Enterを押せばOK）。&lt;/p&gt;

&lt;p&gt;このあとブラウザが立ち上がり、Microsoft365にログインすれば、このような画面が出てトークンを自動的にrcloneが取得する。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwktgekk6ohi1qa6lbyg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwktgekk6ohi1qa6lbyg.png" alt="image" width="504" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;設定が終わったら、以下のようなコマンドでデータを同期することができるので、ジョブとして自動化するのも簡単。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;./rclone sync SP-Online:/ S3:/sponline-to-s3-datacopy-test/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;rcloneの機能で事足りるユースケースであれば、スクリプトを書かずに済むので便利。&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;というかAWSの内容はなく、ほとんどSharePoint Onlineの話になってしまった（苦笑）。しかしEC2上で試しているので、EC2を連携サーバーにできるという証明はできた。&lt;/p&gt;

</description>
      <category>aws</category>
      <category>sharepoint</category>
      <category>microsoft</category>
      <category>rclone</category>
    </item>
  </channel>
</rss>
