ごった煮

色々な事を書いてます

node の環境を docker-compose で簡易的に構築するための覚書

node のプロジェクトを扱っていると、バージョンの混在やらで環境が汚れがちなので、コンテナに押し込むようにしてるのですが、 頻繁に使わない分いろいろ忘れがちなので、いつも開発環境で使っている設定やらを備忘録として残します。

Dockerfile の準備

よくある Dockerfile を書きます。 node の Latest バージョンを取得して、コンテナの /home/app を作業用ディレクトリとして設定 3000 ポートをリッスンします

FROM node:latest

WORKDIR /home/app
USER node
ENV PORT 3000

EXPOSE 3000

ENTRYPOINT /bin/bash

Docker-compose.yml の準備

localhost の 8080 をコンテナの 3000 ポートに転送します また、初回起動時のみ npm install を実行し、そのあとにアプリケーションを立ち上げたいので、それを実行するための init.sh と npm run dev を command に仕込みます。

version: "3"
services:
  node_dev_env:
    build: .
    entrypoint: 
      - sh
    command: 
      - -c
      - sh init.sh; npm run dev
    container_name: node-docker
    ports:
      - 8080:3000
    volumes:
      - ./:/home/app

init.sh

check というファイルが存在しない場合だけ、npm install を実行し、check を生成します

#!/bin/bash

if [ -e "./check" ]; then
    echo "FILE is exit"
else
    npm install
    touch check
fi

実行

docker-compose up -d

コンテナに入りたい場合は、この後に

docker container exec -it {コンテナ名} bash

最後に

完全に自分用の備忘録なのでご参考までに

日本語版の Windows から英語版 Windows へ zip ファイルを持ち込んだ際に文字化けした話

PC を買い替えて、英語版の Windows を使うようになったのですが、元々の日本語環境からファイルを移動する際に、zip に固めて持ち込んだところ、 日本語が文字化けする現象に遭遇したので備忘録を残します。

環境

旧環境

  • システム言語を英語にした日本語版 Windows 11

新環境

発生している現象

旧環境にて、Explorer の機能を使ってファイルを圧縮、新環境にて Explorer で解凍したところ、日本語がすべて文字化けした

原因

日本語版の Windows は、ファイルを圧縮する際に Shift-JIS で圧縮しているが、英語版では、UTF-8 で解凍するため、文字化けが発生する

対処方法

使うツール

f:id:papemk2:20220106150014p:plain

作業

※ 作業は、解凍の際に行います。

下記のコマンドを実行する

7za.exe x -mcp=932 [解凍するファイル]

まとめ

システム言語を英語にした日本語版 Windows も、てっきり全て UTF-8 で処理するものかと思ってましたが、実態は違ったようです。 似たような現象に陥っている方は、是非試してみてください

仕事用 PC として Surface Laptop Studio を輸入した話

ここ何か月か、仕事用に使ってる Thinpad の調子が絶望的に悪く、非常にしんどい思いをしていたので、ちょうど買い替えの時期ということもあり、Surface Laptop Studio を思い切って購入しました。

購入の経緯

20歳頃から、ずっと Thinkpad Yoga シリーズを使い続けて来て、順当にいけば X1 Yoga の最新モデルを買うところでしたが、ドライバ、ハードウェア共に品質が悪化の一途を辿っているのを感じた点、 また、4k を複数枚出力する環境で Intel Graphics が辛すぎる点があり、品質が安定していて、GPU を積んでいる機種で新しいものを探していました。

そんな折、10月に Surface Laptop Studio が発表されスペックも申し分ないなと思い、日本での発売を待っていました。 ところが、年末になりいよいよ Thinkpad がダメそうな雰囲気になり、急遽 us 版の Surface Laptop Studio を 12/30 に発注しました。

買ったスペック

CPU : Core i7 11370H GPU : GeForce RTX 3050 Ti RAM : 32GB ストレージ : 1TB

のモデルを購入しました。

f:id:papemk2:20220105174052p:plain

買った場所

MS ストアは、日本への発送をしてくれない + 欲しいモデルの在庫がないということで、見送りました。 また、Amazon.com も、在庫がなく断念しました。

そこで、H&B というアメリカ版ヨドバシカメラのようなショップを使うことにしました。 ここは、日本へも発送してくれるため、特に何も考えずにここで購入しました。

https://www.bhphotovideo.com/

購入の流れ

H&B で普通にお買い物をします。

海外通販だと、その国で発行されたカードじゃないと通らない場合や、日本へ発送してくれないなどがありますが、ここでは特に何も考えずにお買い物をします。 因みに、自分は、PayPal で支払いました。(メインのカードが、海外通販で使うとほぼ一発ストップになるので)

ここで、自分が気を付けるポイントとしては、輸入関税や輸入時の消費税をこの場で払うことが出来るのですが、この時点で払うと、大体の場合払い過ぎになってめんどくさいので、 後で払うオプションがある場合は、そのオプションを利用します。(今回の場合、B&H から提示された金額が $198 だったのに対して、日本で払った金額が 18,000 円 + 手数料 1,000円 でした)

日本時間 12/30 の深夜に注文して、朝起きたくらいで、発送しましたメールが届きました。 配送担当は、DHL でした。

年末年始なのにすごい!

その後、us 国内を転々として、1/2 頃日本に向けて出発、1/3 には、日本に到着していました。

日本の税関は、12/31 ~ 1/3 まで特別通関部門が担当するため、翌週くらいまで待たされるのかと思っていましたが、1/4 には、通関処理を終えて佐川急便に引き渡されました。 その翌日、1/5 に、手元に到着という感じで、一週間掛からずに手元に届くというかなりスピーディーな配送をしてもらいました。

f:id:papemk2:20220105174001p:plain

ファーストインプレッション

まだ手元にきて数時間ですが、今まで使っていた Thinkpad とは、雲泥の差でした。 今までは、Windows のスナップを使うと、確実にもたついていましたが、一切もたつかなくなりました。

また、筐体も非常に高級感のあるアルミボディで、所有欲を満たしてくれるデバイスだと感じました。 重量的には、1.8kg と結構ずっしりですが、重すぎるといったことはなく、許容範囲でした。

f:id:papemk2:20220105174534p:plain

ディスプレイは、Vaio Z のように変形するタイプでペンを使った作業もしやすいということでしたが、まだペンが届いていないので、その辺については、また別途ブログを書こうかと思います。

技適について

いつもの Surface シリーズのように、ディスプレイ裏に技適マークがありました。

技適が通ってなかったらどうしたもんかと思ってましたが、これで大手を振って使えます。

Windows の「ファイルを指定して実行(Run)」で管理者権限で実行したい

Win + R で表示できる 「ファイルを指定して実行」で、ターミナル等を実行する際、管理者で実行する方法を知らなかったので、備忘録として残します。

やり方

  1. Win + R で「ファイルを指定して実行」を表示
  2. Ctrl + Shift を押しながら OK ボタンを選択 or Ctrl + Shift + Enter

まとめ

Windows 10 までは、タスクバーの Windows ボタンを右クリックすると管理者でターミナルが実行できましたが、Windows 11 から 出来なくなった(表示されなくなった)ので不便に思ってましたが、これにて解決

API Management を Azure AD で保護する

はじめに

この記事は、Azure Advent Calendar 2021 の 15日目の記事になります。

qiita.com

本題

Azure のサービスで API を公開したい場合、API Management (以降 APIM) を使用すると、API の管理、保護などがサービスとして提供される為、 開発者は、API の開発に集中することが出来ます。

そんな中、昨今のセキュリティ意識の高まりから、よりセキュアな API の提供が求められていますが、高度なセキュリティを実装するとなると、かなりの労力や、実装ミスによるトラブル等 厄介な問題が付きまといます。

ということで今回は、Azure AD が提供する機能を使用して、APIM へのアクセスを保護する方法を説明します。

やってみる

前提条件

今回は、次の前提条件の下で作業するので、事前に準備をお願いします。

  • AAD にユーザを作る
  • APIM を作る
  • APIM で呼び出せるエンドポイントを1つ設定する

使用するツール

  • Postman (API 呼出しのチェック用)

Azure AD の設定

まずはじめに、Azure AD に新しくアプリケーションを登録します。

AAD > App registrations > New registration です。

f:id:papemk2:20211214204908p:plain

今回、アプリケーションの種別は、Public client / native (mobile & desktop) を選択します

Redirect URL は、https://oauth.pstmn.io/v1/callback を入力します。(Postman が提供する OAuth 2.0 用の Redirect URI です)

f:id:papemk2:20211214205729p:plain

アプリケーションが登録出来たら次は、Client Secret を生成します。

AAD のアプリケーション管理画面から、Certificates & secrets > New client secret を選択します。

f:id:papemk2:20211214210203p:plain

Secret が生成されたら、コピーします。(後で確認できなくなるので必ずコピーしてください)

f:id:papemk2:20211214210441p:plain

次に、アプリケーションにスコープを割り当てます

アプリケーション管理画面 > Expose an API > Add a scope を選択します。

f:id:papemk2:20211215123830p:plain

スコープを作成すると、用途などを聞かれるので、入力します。

Scope name の下に出ている URI は、コピーしておいてください。

f:id:papemk2:20211215123958p:plain

スコープが出来たら、スコープ名のテキストもコピーしておいてください。

f:id:papemk2:20211215124259p:plain

ここまで出来たら、残りの必要な情報をポータルから取得します。

まず Client Id です。 アプリケーション管理画面 > Overview > Application (Client) ID をコピーします。

f:id:papemk2:20211215105114p:plain

次に、テナント Id です

アプリケーション管理画面 > Overview > Directory (tenant) ID をコピーします。

f:id:papemk2:20211215131622p:plain

Azure AD の認証エンドポイント アプリケーション管理画面 > Overview > Endpoints > OAuth 2.0 authorization endpoint (v2)

Azure AD のトークンエンドポイント アプリケーション管理画面 > Overview > Endpoints > OAuth 2.0 token endpoint (v2)

OpenID Connect の well-known エンドポイント アプリケーション管理画面 > Overview > Endpoints > OpenID Connect metadata document

f:id:papemk2:20211215122032p:plain

Postman でアクセストークンを取得する

アクセストークンを取得する為の情報が揃ったので、アクセストークンを取得します。

Postman の Authorization タブ にて、下記の設定を行います。

項目 設定値
Type OAuth 2.0
Grant Type Authorization_Code
Authorize using browser チェックする
Auth URL 先ほどの認証エンドポイント
Access Token URL 先ほどのトークンエンドポイント
Client ID クライアント Id
Client Secret 生成した Secret
Scope openid offline_access 先ほど作ったスコープ

設定がセット出来たら、Get New Access Token ボタンを押します。

Azure AD の認証が入るので、作業をしていたディレクトリのアクセス情報でログインします。

ログインに成功すると、次の様な画面になります。

また、コールバック URL が https://oauth.pstmn.io/v1/callback?code={authorization_code}&session_state={セッションステート} となっており、code の値をコピーします。

この authorization_code を次のフローでアクセストークンに引き換えます。

※ authorization_code は、10分で切れるので、切れた場合は再取得します

f:id:papemk2:20211215105654p:plain

設定しているスコープについて

今回は、openid と offline_access を許可しています。

これらはそれぞれ、

openid : OpenID Connect を使用してサインインする場合に必須なスコープです。このアクセス許可があると、アプリは、ユーザの一意識別子を取得できます。

offline_access : アプリがユーザの代わりに長期間アクセス権を得ることが出来るようになるスコープです。このアクセス許可を指定することで、アクセストークン取得時に、refresh_token を合わせて取得できるようになります。

また、自身が保護したいアプリの要求するスコープを適宜追加することも可能です。(APIM の API を read のみ出来るカスタムスコープなど)

authorization_code をアクセストークンに引き換える

先ほど取得した authorization_code から、 先ほど取得したトークンエンドポイントに対して、次のパラメータで POST リクエストを送ります

項目 設定値
Content-Type application/x-www-form-urlencoded
code authorization_code
client_id クライアント Id
grant_type authorization_code
scope openid offline_access 先ほど作ったスコープ
redirect_uri https://oauth.pstmn.io/v1/callback(最初に登録した Redirect URL)

成功すると、次の様な json が返ってきます。

{
    "token_type": "Bearer",
    "scope": "指定したスコープ",
    "expires_in": アクセストークンの有効期限(秒),
    "ext_expires_in": Azure AD のセキュリティトークンサービスが停止していた場合のトークンの最大延長期限,
    "access_token": "アクセストークン",
    "refresh_token": "リフレッシュトークン",
    "id_token": "id トークン"
}

これにより、アクセストークン、リフレッシュトークンが取得できました。

これ以降、API 呼出しは、access_token の値を Authorize ヘッダに Bearer トークンとしてセットして使用します。

また、アクセストークンの有効期限は非常に短い為、リフレッシュトークンを使用して、常にアクセストークンを新しくしていく必要があります。

リフレッシュトークンでトークンを更新する

トークンエンドポイントに対して、次のパラメータで POST リクエストを送ります。

項目 設定値
Content-Type application/x-www-form-urlencoded
refresh_token リフレッシュトーク
client_id クライアント Id
grant_type refresh_token
scope openid offline_access 先ほど作ったスコープ

これにより、新しいアクセストークン、リフレッシュトークンが返されます

リフレッシュトークンの有効期限も、デフォルトで90日なので、トークン更新のタイミングで一緒に交換する等を検討する必要があります。

{
    "token_type": "Bearer",
    "scope": "指定したスコープ",
    "expires_in": アクセストークンの有効期限(秒),
    "ext_expires_in": Azure AD のセキュリティトークンサービスが停止していた場合のトークンの最大延長期限,
    "access_token": "アクセストークン",
    "refresh_token": "リフレッシュトークン",
    "id_token": "id トークン"
}

APIM を構成する

アクセストークンを取得できましたが、APIM は、デフォルトで Authorization ヘッダを検証しない為、トークンを使わなかったり、適当なトークンを投げられた場合も素通りします。

そこで、Azure AD で取得したアクセストークンを APIM で解析する設定を追加します。

アクセストークンは、jwt なので、APIM で事前に Authorization ヘッダの jwt を検証する仕組みを追加します。

早速 APIM の設定を行いましょう

APIM の管理画面 > APIs > 設定したい API > All APIs(それぞれの API でも可) > Inbound processing に進みます。

f:id:papemk2:20211215121643p:plain

Add Policy を選択すると、その中に Validate JWT の項目があるので選択します

f:id:papemk2:20211215121729p:plain

次の画像の様にフォームを埋めて保存します。

Basic だと、Issuer を埋められないので、Full を選択します。

f:id:papemk2:20211215131826p:plain

これで APIM の基本構成が出来ました。

Postman にて、Authorize ヘッダに Bearer トークンとしてアクセストークンをセットすれば、正しくアクセスできるはずです。

まとめ

これにて、Azure AD を使って APIM を保護できるようになりました。

手順はたくさんありますが、一度設定してしまえば、後は API を呼び出すだけなので、セキュリティを強化するという意味で是非やってみましょう。

今回は、かなり説明を割愛した部分があるので、次回以降それぞれの項目を深堀していく記事を書いていく予定です。

Visual Studio 2022 で App Service の .NET アプリにリモートデバッグする方法について

Visual Studio 2022 が出て久しいですが、Cloud Exolorer がリタイアした為、リモートデバッグの方法が変更になりました。

正直あまり使用しない機能ですが、いざという時に便利なので、備忘録として残します。

手順

  1. Connected Services にて対象の App Service を追加する
  2. Connected Services から対象の APp Service に対してリモートデバッガを Attach

Connected Services に App Service を追加する

Connected Services は、ソリューションエクスプローラ > プロジェクト からアクセスできます。

デフォルトだと、何も設定されていないので No service dependencies discovered となっているはずです。 f:id:papemk2:20211214122523p:plain

Connected Services を右クリックすると、Managed Connected Services の項目があるのでそちらを選択します。 f:id:papemk2:20211214122837p:plain

Connected Services の管理画面は、次の様な画面です。 この画面から、App Service の参照を追加します。 f:id:papemk2:20211214122920p:plain

画像内の赤枠、右上の + マークか、Add a service dependency を選択します。 f:id:papemk2:20211214123233p:plain

赤枠の項目を選択すると、ダイアログが出てきます。 ダイアログを一番下までスクロールすると、Azure App Service の項目が出てくるので選択します。 f:id:papemk2:20211214123456p:plain

Azure App Service を選択すると、リソースを選ぶ画面が出るので、リモートデバッグしたいリソースを選択します。 f:id:papemk2:20211214124023p:plain

リソースを選択すると、色々処理が走りますが、次の様に Complete が表示されたら完了です。 f:id:papemk2:20211214124215p:plain

リソースが追加されると管理画面とソリューションエクスプローラに名前が表示されます。 f:id:papemk2:20211214124317p:plain

f:id:papemk2:20211214124354p:plain

リモートデバッグを実行する

※ 初回実行 or 前回のリモートデバッグから時間が空いている場合、App Service のリモートデバッグをオンにしたりする処理が走るので、少し時間が掛かります。

Connected Services の管理画面から

デバッグしたいリソースの隣にある 三点リーダー > Attach Debugger からリソースのプロセスにアタッチします。 f:id:papemk2:20211214125705p:plain

ソリューションエクスプローラから実行する

ソリューションエクスプローラConnected Services > 対象のリソース を右クリックして、Attach Debugger を選択します。 f:id:papemk2:20211214125837p:plain

まとめ

VS 2019 から手順が少し変わりましたが、これでいつも通りのリモートデバッグが出来るようになりました。 リモートデバッグだと、Debug ビルドでデプロイする必要があるなど、スナップショットデバッグと比べて、そこまで使い勝手が良いわけではないですが、いざという時に使えるので覚えておいて損はないと思います。

Microsoft MVP for Microsoft Azure を受賞しました。

今年も Microsoft MVP を受賞させていただきました。(本年度は、COVID-19 の影響もあり審査がありませんでした。)

2016年からなので、6年目なのですが、受賞時期の関係で1度審査がスキップされたこともあり、受賞は5度目です。

mvp.microsoft.com

また1年よろしくお願いします