yyp٩( 'ω' )و

色々触って遊んでます

EC2インスタンスを夜になったら自動で停止する 前編

背景

個人のAWS環境のインスタンスを止め忘れてしまうことが度々あるので、この仕組みを作ることにしました。

方法を考える

1. Lambdaを使う方法

インスタンスを停止する関数を作り、CloudWatch Eventのcronで毎晩起動してあげればできそうです。
"Lambda EC2"でググったら公式のQ&Aもありました。

aws.amazon.com

2. Systems Managerを使う方法

Systems ManagerのAutomationドキュメントに"AWS-StopEC2Instance"というのがあります。
これをMaintenance Windowで毎晩実行するように指定してあげればできそうです。

実装

今回はLambdaの勉強も兼ねて、1. の方法で実装したいと思います。
上で載せたQ&Aを参考に進めていきます。

Lambda関数の作成

Lambda関数を作ります。
「一から作成」を選択して、関数名とランタイムを下記のように設定します。

関数名: StopEc2Instances
ランタイム: Python3.7

アクセス権限については今回はカスタムロールを作るので、
「関数のアクセス権限を定義するロールを選択します。カスタムロールを作成するには、IAM コンソールに移動します。」
からIAMコンソールに移動してロールを作ります。

IAMロールの作成

IAMロールを作ります。
「信頼されたエンティティ」は「AWSサービス」、「このロールを使用するサービス」は"AWS Lambda"を選択し、「次のステップ: アクセス権限」をクリック。
f:id:mizukichi3:20190423210041p:plain 今回はカスタムポリシーを使うので、「ポリシーの作成」をクリックしてポリシーの作成ページに飛びます。
f:id:mizukichi3:20190423210505p:plain "JSON"タブをクリックし、下記のポリシーを貼り付けます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}

「ポリシーの確認」をクリックし、名前をつけます。今回は"stop-instances-lambda-policy"にしました。
説明は入力しなくても良いので今回は省略します。
「ポリシーの作成」をクリックするとポリシーが作成されるので、作りかけになっていたロールの作成画面に戻ります。
更新ボタン(ぐるぐるしてる矢印マーク)を押して、先ほど作成したポリシーを探し、チェックボックスにチェックを入れます。
「アクセス権限の境界の設定」については今回は必要ないのでそのままで。
次のステップの「タグ」も現時点では必要ないのでスキップします。
ロールの名前をつけて、「ロールの作成」をクリックして終わりです。

Lambda関数の作成 続き

作りかけになっているLambda作成画面に戻ります。
「アクセス権限」 > 「実行ロールの選択または作成」> 「実行ロール」プルダウンから「既存のロールを使用する」を選びます。
更新ボタンを押して、プルダウンを開くと先ほど作成したロールが出てくるので、選択します。
これで関数の箱ができました。

トリガーの設定

Lambda関数を動かすためのトリガーを設定します。
今回は毎日夜0時にインスタンスを停止するように設定します。
Lambdaコンソールで、「トリガーの追加」から"CloudWatch Events"を選択します。
「トリガーの設定」 > 「ルール」で「新規ルールの作成」を選択します。
名前をつけ、ルールタイプの設定をします。
今回は定刻にLambdaを起動したいので、「スケジュール式」を選択します。
「スケジュール式」に下記のcron式を入力します。

cron(0 15 * * ? *)

※ここではタイムゾーンUTCなので、-9した値を使います。
こんな感じです↓
f:id:mizukichi3:20190423213317p:plain

次回: 関数の中身の作成

だいぶ長くなってしまったので、本題とも言えるLambda関数のコードを書くのは後編に分けようと思います。
東京リージョンのインスタンスをすべて停止するように、*とかで指定できるかなと思ったのですが、InstansIdsって必須なんですね…
IDのハードコードはなるべくしたくないので、一旦起動中のインスタンスのIDを持ってきて変数に入れるということが必要そうです。

ドラえも〜〜〜ん!!インターネットが繋がらないよ〜〜〜!!

ふと「ドラえも〜〜〜ん!!インターネットが繋がらないよ〜〜〜!!」とドラえもんに泣きつくのび太くん、という図が思い浮かんだので、
インターネットが繋がらなくなった時のTips的なやつをのび太くんとドラえもんの会話で書いてみます。

のび太くんの持っているPCからブラウザでWebページを見ることができなくなったという想定で書きます。
サーバ - インターネット間の通信は今回は除外します。

※※完全に勢いで書いたので間違っている部分もあるかもしれません。ご承知おきください。

のび太「ドラえも〜〜〜ん!!インターネットが繋がらないよ〜〜〜!!」
どらえもん「どうしたんだいのび太くん」
のび太「ブラウザを開いたんだけど、インターネットが見れないんだよ〜〜〜」
どらえもん「まずはのび太くんのパソコンがインターネットに繋がれる状態かみてみよう」

Windowsであればタスクバー、MacであればメニューバーにあるWi-Fiっぽいマークが
ちゃんと表示されていることを確認します。
無線LANの場合はPCにケーブルが刺さっているっぽいマークが表示されていることを確認します。

ドラえもんのび太くんはインターネットには繋がれる状態みたいだね」
のび太「じゃあなんで見れないの?」
ドラえもん「見ようとしたWebページとは別のページも見てみよう」

ここで表示できたら、そのWebページがあるサーバがダウンしているか、DNSの問題である可能性が高いです。

のび太「他のサイトは見れるよ」
ドラえもん「ふむふむ。のび太くんが見ようとしていたWebページのサーバがダウンしているかもしれないね」
ドラえもん「他のところにある問題という可能性もあるから、調べてみよう」
ー黒い画面を起動して何やら打ち込むドラえもん

DNSの問題かどうか調べます。
WindowsならコマンドプロンプトPowershell, Macならターミナルを起動して、nslookupで名前が引けるかどうか確認します。
ここで名前が引ければ、DNSの問題ではなくサーバ側に問題がある可能性が高いです。
しばらく待ってからアクセスしてみましょう。

ドラえもん「名前が引けないから、DNSの問題かもしれないね。」
ドラえもん「見に行くDNSサーバを変えてみよう」

Windowsの場合「コントロールパネル」から、Macの場合「システム環境設定」から見に行くDNSサーバを変更します。
Googleが提供している8.8.8.8などのパブリックDNSに変更します。
※詳しい変更方法は割愛します。
それでも閲覧できなければ、サーバ側の問題がある可能性が高いので、しばらく待ってからアクセスしてみましょう。
利用者がたくさんいるサービスであれば障害情報を出しているかもしれないので、調べてみてもいいかもしれません。

のび太「わあ!見れたよ!ありがとうドラえもん!」
ドラえもん「よかったねのび太くん」
のび太「お礼にどら焼きをあげるよ!」
ドラえもん「ありがとうのび太くん!」

繋がったみたいですね。
今回の原因は、DNSサーバ側の問題でした。
のび太くんのPCが普段見に行っているDNSサーバがダウンしている等の問題が起こっていると考えられます。
変更したDNSサーバについては気になるようであれば元に戻しても良いですし、気にならなければそのままでいいと思います。

tilリポジトリを作ってみる

社内のチャットでGitHubのtilリポジトリというものについて話しているのを見かけたので、調べてみました。
tilは"Today I Learned"の略で、その日覚えたことを書いていくリポジトリみたいです。*1
私も結構わからないことがあって都度調べているので、こういう形で残しておくのもいいかなと思い、作ってみました。
(毎回ブログを書くとなると結構重い、というのもあります)

github.com

GitHub上で作成するか、自分のローカルで作ってpushするかは悩みどころですね。
Markdownで作ろうと思うので、とりあえずはGitHub上でやってみようと思います。

MacでGitHubのセットアップをする

Gitを使う勉強会に行くのですが、まだMacにしてから使っていなかったので環境設定をしました。   たまにしかしない作業なので自分のためのメモとして残しておきます。   Windowsの時もお世話になった、こちらを参考にさせていただきました。

qiita.com

目的  

GitHubでpush/cloneができるようにする。
二段階認証も設定できるとなおよし。

環境

  • OS
  • ターミナル
    • iTerm 3.2.6

Gitインストール確認&設定

まずGitをインストールだ〜と思ったら、Macはデフォルトで入っているんですね。

$ git --version  
git version 2.17.2 (Apple Git-113)  

次にメールアドレスと名前を設定します。

$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"

この設定をしていないとgit commitができません。

キーペア作成

GitHubと連携するために、キーペアを作ります。

$ mkdir ~/.ssh  
$ cd ~./ssh  
$ ssh-keygen -t rsa  
Generating public/private rsa key pair.  
Enter file in which to save the key (/Users directory/.ssh/id_rsa): #ここでキーペアの名前を変えられる  

キーペアの名前を変えなければ/Users directory/.ssh/配下にid_rsaとid_rsa.pubができます。

ssh configの作成

キーペアの名前を変えている場合、ssh configの設定が必要です。

Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/hogehoge #自分の秘密鍵をフルパスで  
  User git

GitHubと連携

GitHubに先ほど作成したキーペアの公開鍵(.pubがついている方)を置きます。
公開鍵と秘密鍵は間違えると大変なので注意!
GitHubにログイン > 右上の自分のアイコン > Settings > 左のメニュー"SSH and GPG keys" まで行きます。
New SSH keyで鍵の名前と中身を入力します。
Add SSH keyで内容を保存したら、接続確認。
自分のリモートリポジトリからcloneできるか確認します。

$ git clone git@github.com:hoge/fuga.git

※sudoでやるとできません。
cloneができたら次はpushできるか確認します。
READMEを作ってpushしてみます。

$ cd {cloneしてきたリポジトリのディレクトリ}  
$ touch README.md
$ git add README.md  
$ git commit -m "created README.md"
$ git push

pushが完了したら、GitHubで反映されているか確認。
反映されていたら、連携の設定は完了〜

二要素認証の設定

そんなに大事なものは置いていないのですが、公開鍵を置いているので一応二要素認証でログインするように設定します。
GitHubにログイン > 右上の自分のアイコン > Settings > 左のメニュー"Security" まで行きます。
"Enable two-factor authentication"をクリック。
"Set up using in app"と"Set up using in SMS"があります。
一応他のサービスでGoogle authenticatorを使っているのですが、電話番号で済むならそれがいいと思ったので、SMSにします。
クリックするとRecovery codeが表示されるので、ダウンロードやコピーで保存して置きます。
何らかの理由で接続できなくなった際の復旧に必要なので、失くさない!
保存したら"Next"で次に進む。
電話番号を入力して、SMSが来たら記載の6桁の数字を入力して完了!
今後はサインインの際にSMSで番号が届きます。

MojaveでVirtualBoxがインストールできない 〜暫定対応編〜

これのその後です。
mizukichi3.hatenablog.jp

VitrualBox6.0を入れてみる

Candidate版の6.0が出たみたいなので、これを入れてみました。

virtualbox.org • View topic - VirtualBox 6.0 Release Candidate 1 released

ですが結果は同じく、インストールに失敗。

ネットワーク周りがいじれない

よくみてみると、「アプリケーション」ディレクトリにVirtualBox自体は存在していました。
適当に仮想マシンを作成して起動しようとしてみると、カーネルモジュールがインストールされていないというエラーが出ました。
他にもネットワーク周りがいじれないようです。*1
Windowsだと「管理者として実行」すると解決する場合もあるので、sudoで起動等を試してみましたがだめでした...

回避策を試す

前回も触れた回避策を試してみます。

qiita.com

色々調べてみたところ、リカバリーモードでの起動はAppleのサポートサイト*2でも紹介されていて、そんなに怖いものではないということがわかったので...

まずMacを再起動。
この時に⌘+rを押し続けて、リカバリーモードで起動します。
リカバリーモードで起動したら、上のメニューの「ユーティリティ」から「ターミナル」を起動します。
「ターミナル」を起動したら、下記のコマンドを実行します。

$ csrutil disable  

「ターミナル」を閉じて、通常の再起動。
その後VirtualBoxdmgを実行したところ、インストールが正常終了し、VirtualBoxも起動できました。
参考にした記事ではコマンドを実行してVirtualBoxを起動していましたが、今回はダブルクリックで正常に起動できました。バージョン違うからかな?

*1:後ほど5.2.22も入れてみましたがこれらの挙動は同様でした。

*2:https://support.apple.com/ja-jp/HT201314

MojaveでVitualBoxがインストールできない

VirtualBoxが入らない

Macbook AirVirtualBoxを入れようと思ったら全然入らない...
OSのバージョンを確認。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.1

Mojaveにインストールできない問題はもう解決されているはずなんだけれど...

applech2.com

修正された5.2.14と最新版5.2.22両方とも試してみたけどだめでした。

回避策

回避策はあるようです。

qiita.com

ただ、Macリカバリモードで起動する必要があるようです。
Mac買ったばかりなので何かあったらと思うとちょっと怖い...

VirtualBoxのアップデートを待つ

VirtualBoxchangelogを見てみると、大体毎月初め〜中頃にアップデートがあるみたいです。

Changelog – Oracle VM VirtualBox

そんなに急ぎではないので、アップデートを待ってみることにします。
変わらなかったらISSUE漁ってみよう。

UNDERTALEをやりました。

技術ブログ、転職ブログみたいな感じになってますが、明確なカテゴライズをするつもりはないのでゲームの感想を書きます。
私は結構なゲーマーでもあるので、ゲーム遍歴とかも今度書こうかな。

今回は「UNDERTALE」です。

目次

  • ゲーム概要
  • ネタバレなし感想
  • ネタバレあり感想

    ゲーム概要

    「誰も死ななくていいRPG」というキャッチコピーです。
    それ以上のことは言うまい…(ケツイ)
    未プレイの人で少しでもプレイする可能性のある人は、事前情報なしでやってほしい…!
    おすすめしたい人:ゲーム好きな人。特にドラクエとか王道RPGを楽しくプレイしてきた人。

    ネタバレなし感想

    ゲーム好きの友人がSteam時代にやってて、「面白いよ~」と言ってたので、結構前から自分の「やりたいゲームリスト」に入っていました。
    PCでやってもよかったんですが、ゲームはなるべく据え置き機でやりたい派なので、持ってるハードで出ないかな~と待つこと2年ほど。
    Nintendo Switchで発売というニュースを耳にし、Amazonで予約。
    「事前情報なしでやって欲しい」「記憶を消してもう一度やりたいゲーム」という情報を耳にしていたので、頑張ってネタバレ回避。
    公式HPも見ないようにしました。
    プレイ後の感想:ヤバぉ!!! 「記憶を消してもう一度やりたいゲーム」というのは本当でした。
    私はプレイ中、どうしても我慢できなくなって途中でネタバレ検索をしてしまったのですが、それもしなければよかったと若干後悔しています。
    なので以降の感想は、クリアしていない方はブラウザの「戻る」ボタンを押してください。

続きを読む