くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

コンソール

AWS instance-connect利用でブラウザでサーバコンソール触れるようにする

タイトル通り。

2年前くらいはこれなかったと思うのですが、いつから出来るようになったんだろ。

Azureはブラウザからサーバコンソールをちょろっと触れたり出来たので、AWSも出来ないかなーと思ってたところ、今見たら出来そうだったのでお試し。ちょっとはまった。

公式のドキュメント

流れ。

  1. セキュリティポリシーの変更
  2. EC2 Instance Connectをサーバ側にインストール
  3. EC2 Instance Connect の IAM アクセス許可を設定する


セキュリティポリシーの変更

今回はまったのがここ。動かない時は下記のエラーメッセージ出る。

We were unable to connect to your instance. Make sure that your instance’s network settings are configured correctly for EC2 Instance Connect.

普通に制限してるアクセス先のみのIP設定だけでよいと勘違いしてた。どうもそうじゃないらしい。AWSが公開してるリージョンのIPを解放しないとダメな模様。何かを経由してアクセスしてるのかしら?

AWSが公開してるIPの範囲

東京リージョンなら、3.112.23.0/29。(2021/2/2時点)

こんな感じで追加。

sample

EC2 Instance Connectをサーバ側にインストール

最近はデフォで入ってるらしい。入ってない場合は公式のドキュメントに書かれてる感じでインストール。

IAM アクセス許可を設定する

AWS CLI入ってる端末ならどこでも。

公式通りですが、こんな感じで設定。

例えばmy-policy.jsonで↓のような内容でファイル作る。

{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Action": "ec2-instance-connect:SendSSHPublicKey",
        "Resource": [
            "arn:aws:ec2:region:account-id:instance/i-1234567890abcdef0"
        ],
        "Condition": {
            "StringEquals": {
                "ec2:osuser": "ami-username"
            }
        }
      },
      {
        "Effect": "Allow",
        "Action": "ec2:DescribeInstances",
        "Resource": "*"
      }
    ]
}

regionは東京リージョンなら、「ap-northeast-1」

account-idは対象IAMユーザのアカウントID。712345678901みたいなやつ。

/i-1234567890abcdef0のところは対象のEC2のインスタンスID。

ami-usernameはインスタンスへのログインユーザ名。デフォならec2-user

ファイル作ったら下記コマンド

aws iam create-policy --policy-name my-hogehoge-policy --policy-document file://my-policy.json

policy-nameは適切につけた方がよさげ。

aws iam attach-user-policy --policy-arn arn:aws:iam::account-id:policy/my-hogehoge-policy --user-name IAMユーザのAWSへのログインユーザ名

my-hogehoge-policyは一つ前のコマンドで指定したポリシー名。


これでブラウザからコンソールいじれるという寸法です。


2021/2/11追記

このブラウザ上のコンソール、タイムアウトが結構早い。10分くらい。

これ伸ばせないのかしら?設定的なものが見つからない。。。

電話とか来ると再接続メンドウ。

C#のコンソールアプリでカーソルを先頭に戻す

コンソールアプリとしてツールを作ってると、処理の進捗とかをコンソールに出してあげたくなる。 普通にやると、メッセージだけでコンソールがどんどんスクロールしちゃうので感じ悪い。 同じ行でカウントアップの結果を表示したりしたいわけです。

で、これをやるためにはカーソルを行先頭に戻して書き直せればいいわけで、 ググるとだいたい↓の感じで出てくる。

Console.SetCursorPosition(0, Console.CursorTop);

これでカーソルが先頭に戻るでそのまま出力しなおせばいい。とゆーわけですが、 世の中そんな甘いもんじゃない。

ありがちな、|とか/をクルクル回すやつとか、「123/234」みたいな進捗出す奴は上のだけでいける。 ↓の感じ。

//カーソルのちらつきがイラつく場合はカーソル非表示に。。。
Console.CursorVisible = false;
for(int i=0;i<10000;i++)
{
        Console.Write("{0} / {1}", i, 10000);//進捗をカウンタで表現する場合
	Console.Write("|/―\".Substring(i%4,1));//クルクル回す場合
	Thread.Sleep(100);
	Console.SetCursorPosition(0, Console.CursorTop);
}

↑みたいに、文字数が固定か、増えていくだけの場合は問題ない。でも、例えば処理してるファイル名を表示している場合で「textdata01.txt」の後に「data01.txt」が来ると↓の感じになる。 test

そうじゃないんだ。

カーソル先頭に戻してるだけなので当たり前といえば当たり前か。これが嫌なので一行クリアしてくれる物がないか探してみたけど・・・無い。Clearはあるけど画面が全部クリアされる。コマンドでいう「cls」。しょうがないの今は↓の感じで対応中。

int prePos = Console.CursorLeft;//現在カーソル位置を取得
Console.SetCursorPosition(0, Console.CursorTop);
Console.Write(hogestr.PadRight(prePos));//前のカーソル位置まで空白埋めする

かっこ悪いけど、無い頭ではこれが限界だったとさ。

問合せ