淡々と備忘録を綴る

IT周りの行き詰まったところやメモを備忘録として記録します

powershellでパラメータ付きエイリアスを登録する

やりたいこと

powershellでもエイリアスを使いたい。(bashの.bashrcみたいなことをしたい)

やったこと

  • profileの記述
  • profileの実行

profileの記述

poweshellでのAliasの記述は以下のパスに記述される。 このパスは環境変数に登録されているので$PROFILEで呼び出し可能

PS C:\Users\XXXX> $PROFILE
C:\Users\XXXX\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1  

イメージ的にはこれがbashでいう.bashrcみたいなもの。。。ではなかった。※後述
このファイルの中にエイリアスに登録したい内容を記載することで実現できる。フォーマットは以下の通り。

function vm(){
  C:\WINDOWS\system32\vmconnect.exe localhost Ubuntu
}

例示してあるのはHyper-v上に構築したUbuntuをコマンド一発で起動するためのエイリアス。(いちいちHyper-vマネージャを起動するのが面倒だった。
ついでに、ここではコマンドにパラメータを渡しているためfunctionを宣言しているが、 パラメータが必要ないならもっと簡単にかける。

Set-Alias [エイリアス名] [コマンド]

profileの実行

powershellのprofleを.bashrcのように考えているとここで躓いた。profileにエイリアスを記載しても反映されないのである。
これは考えてみたら当たり前で、実態は「Microsoft.PowerShell_profile.ps1」であるから。
ps1ってこれスクリプトファイルやん。だったら実行してどこかに読み込ませるんだと思ってさっくり実行。

PS C:\Users\XXXX> .$PROFILE

なにもエラーがでなければ無事読み込みが完了しているのでエイリアスが実行できるはず。
普段スクリプト動かさない人だとExecutePlicy関係で怒られるかもしれないので、そのときはスクリプトの実行権限与えて再実行すべし、以上。

Hyper-V上に構築したUbuntu20.04の画面サイズを大きくする

目的

Hyper-v上にGUIベースのLinuxマシンを構築するにあたって、全人類がぶち当たる問題が 「画面サイズが小さいこと」である。 今回はHyper-V上に立てたUbuntuを全画面表示できるように設定したのでここにその作業を残す。

使用環境

  • ホストOS:Windows10 Pro
  • 仮想化基盤:Hyper-v
  • ゲストOS:Ubuntu LTS 20.04

    やったこと

  • grubの設定の変更
  • linux-vm-toolsのインストール

grubの設定の変更

まずはじめにgrubの設定ファイルを編集する方法を取った。。
結論から言うと、これは効果なし。
どうやらこの手法が有効なのはUbuntu16系までらしい。残念。
一応やったことを残しておくと、/etc/default/grubファイルを書き換えました、なむ。

sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT の行の末尾に video=hyperv_fb:[変更したい解像度] を追記
sudo update-grub
sudo reboot

linux-vm-toolsのインストール

こっちの方法で解決した。 Ubuntuにxrdpプロトコルで接続するためにlinux-vm-toolsのインストールを行う

sudo apt install git
git clone https://github.com/microsoft/linux-vm-tools.git
cd linux-vm-tools/
git fetch --all
git pull origin pull/106/head:pull_106
git checkout pull_106
cd ubuntu/20.04/
sudo bash ./install.sh
sudo reboot

再起動後、もう一度shを叩くらしい(?)

cd linux-vm-tools/ubuntu/20.04/
sudo bash ./install.sh

これでUbuntu側の準備は完了。 仮想OS:をシャットダウンして、ホスト側のPowerShellで以下のコマンドを実行

Set-VM -VMName <VMの名前> -EnhancedSessionTransportType HvSocket

これで次回実行時xrdpセッションが立ち上がります。

補足

無事拡張セッション(xrdpセッション)が立ち上がったが、ログインして見ると画面が真っ暗。真っ黒。なんで。
原因を調べてみると、Hyper-vの基本セッション上でログインしているユーザを使用してxrdpでログインしたことが原因。
さっくり基本セッションからログオフすると無事画面が表示された。
ちゃんとログオフしておくか、別のユーザを使用してxrdpログオンしましょう。
ついでに、xrdp有効化にしてから基本セッションでターミナルが開かなくなるという致命的な状況になった。が、xrdp経由だとターミナルは使えるので一旦放置している。
いつかこれが原因でドツボに嵌りそうでこわい。

API GatewayでAPIにIAM認証をかけて、SigV4署名を作成してPOSTを実行する

API GatewayでIAM認証を設定して、SigV4署名を実装する機会があったので、備忘録としてまとめる。

IAM認証とは

AWS APIGatewayのAPIを叩くときに使用する認証方法のうちの一つ。事前に権限を絞ったIAMユーザを用意しておき、APIの実行の際にIAMユーザの認証を要求する。認証されたIAMユーザが当該のAPIの実行を認可されている場合に、正常にAPIが応答を返す。

SignV4署名とは

上記IAM認証を実現するための手法。IAMユーザの認証にはアクセスキーとシークレットキーが必要だが、シークレットキーを外部にハードコーディングする訳にもいかないのでSignV4署名を発行して、署名をヘッダに入れることで認証を行う。

注意点

  • Signv4署名のハッシュはリクエスト全体のハッシュを計算する
    SignV4署名の際、IAMユーザの認証のみではなくリクエスト全体の認証も同時に行う。
    つまり、APIを叩く際のリクエストすべてに対して署名を発行することで、実際にAPIを叩くときには署名発行時と全く同じリクエストであるかを確認しているような挙動となる。
    このリクエスト全体というのは、メソッドに種類や(POSTやPUTSメソッドを使用する場合)ペイロードの中身も含まれる。(最初このことを知らなくて多くの時間を無駄にした。。。)
    署名発行の際にはちゃんとペイロードの情報を受け渡しておこうねという訳である。
  • 署名の際に受け渡すデータは文字列であることが必要
    実際にPOSTメソッドでAPIを叩くとき、ペイロードJSON形式で作成することが多くあると想定される。
    上記のペイロードを署名発行の際に受け渡すにあたって、JSONオブジェクト形式では署名発行時にエラーが発生する。 署名発行時にはJSON.stringfyなどを使用して文字列形式にしてから署名を作成することでこのエラーを回避した。

    ソースコード

    以下に、Node.jsで作成したSginv4署名のソースコードを記載する。 なお、この記事/コードを書くにあたって以下のブログを参考にした。 dev.classmethod.jp

const core = require('aws-sdk/lib/core');
const aws = require('aws-sdk');

// アクセスキーとシークレットアクセスキーを設定
const accessKey = 'XXXXXXXXX';
const secretKey = 'XXXXXXXXX';
const credential = new aws.Credentials(accessKey, secretKey);

exports.handler = async (event) =>{
    let method = event.method;
    let url = event.url;
    const res = main(url,method,event.requestBody);
    return res; 
};
function main(apiurl,method,requestBody) {
    // サービス名は、API GatewayのAPIの場合は、execiute-api固定です。
    const serviceName = "execute-api"; 
    // Signers.V4クラスのコンストラクタに渡すオプションを作成します。
    const options = {
        // api gatewayのURL
        url: apiurl,
        headers: {}
    };
    // api gatewayのURLからホスト、パス、クエリストリングを抽出
    const parts = options.url.split('?');
    const host = parts[0].substr(8, parts[0].indexOf("/", 8) - 8);
    const path = parts[0].substr(parts[0].indexOf("/", 8));
    const querystring = parts[1];

    // V4クラスのコンストラクタの引数に沿う形でoptionsを作成
    const now = new Date();
    options.headers.host = host;
    options.pathname = () => path;
    options.methodIndex = method;
    options.search = () => querystring ? querystring : "";
    options.region = 'ap-northeast-1';
    options.method = method;
    if(method == "POST"){
         options.body = requestBody;
         options.headers['Content-Type'] = "application/json";
         }
    
    // V4クラスのインスタンスを作成
    const signer = new core.Signers.V4(options, serviceName);
    // SigV4署名
    signer.addAuthorization(credential, now);
    //署名されたヘッダーを出力
    console.log(options.headers);
    const response = {
        statusCode: 200,
        // body: JSON.stringify(array2responseData(responseArray))
        body: options.headers
    };
    return response;
}

このlamdaにPOSTする内容は以下の通り

{
  "method": "XXXX",
  "url": "XXXXXXXXX"
  "requestBody":XXXX
}