レタスのかわをぜんぶむく

ぜんぶむきます

CloudWatch Logs Insightsのみで指定期間について日付を無視した時間帯毎の頻度をグラフ化する

久々に技術ネタ(小粒)。

CloudWatch Logs Insightsでは指定したロググループのログイベントを専用のクエリ言語で検索したり視覚化することができる。
検索結果は明示的に可視化を利用しなくとも、時系列順に下図のような形でヒストグラムで表示される。
(データは適当に生成した雑なデータ)

f:id:uskey:20220125222632p:plain
3日分のログの発生分布

stats句を利用したクエリでは簡単な集計を行うことが可能で、ドキュメント内でもbin関数を利用した時系列データの視覚化
フィールド別にグループ化されたログデータの視覚化が取り上げられている。

これらの機能は直感的で利用しやすく強力で、例えばアクセスログを対象とした視覚化の場合
前者では例えばAPIに対する5分毎アクセス数を視覚化したり、後者ではHTTPステータス毎の割合を視覚化したりなどが行える。

一方で少し加工した時間情報を利用した集計を行いたい時はひと手間が必要になる。
時系列データの集計に利用されるbin関数では対象とする値は@timestamp固定となっているため、例えばタイトルで示したような指定期間について日付を無視した時間帯ごとの頻度を見たい、といった場合には自前でstats句に渡すfieldを定義する必要がある。

生の@timestampTimeStamp型として扱われており、そこから日や時間や分などのフィールドを指定して取り出すことはできないため、stats句に渡すfieldとしてtoMillis関数でエポックミリ秒に変換して1日のミリ秒数で剰余を取ったものを1時間のミリ秒数で割り、最後にfloor関数で切り下げたものをhourとして定義する。

fields floor((toMillis(@timestamp) + 9 * 3600000) % 86400000 / 3600000) as hour , @message
| stats count(*) as access by hour
| sort by hour asc

(JST変換のために 9 * 3600 * 1000を加えている。)

f:id:uskey:20220125222727p:plain
3日分のデータを日付を無視して1時間毎にまとめた

下記は15分単位の棒グラフとして出力したケース。
アプローチとしては大きく変わらないが、hhmmを4桁の数字として扱うために時と分で分けて計算した上で加算している。

fields (floor((toMillis(@timestamp) + 9 * 3600000) % 86400000 / 3600000) * 100 + 
floor((toMillis(@timestamp) + 9 * 3600000) % 86400000 / 36000 % 100 / 25) * 15) as hhmm , @message
| stats count(*) as access by hhmm
| sort by hhmm asc

f:id:uskey:20220125222759p:plain
3日分のデータを日付を無視して15分毎にまとめた

stats句での視覚化で使える棒グラフでは表示数の上限が100件のためこの用途だと24*4=96でこれが最大の分解能。
この用途において、これ以上細かな単位で見たい場合はCloudWatch Logs Insights上の視覚化は利用できないため
素直にデータを吐き出して別で視覚化する必要がある。

また、追加の注意点として対応する単位時間にデータが存在しない範囲については棒が表示されない。
そのため、例えばアプリケーションログを対象としてシステムの動作時間帯を把握する用途か、最低でも15分に1度はアクセスがあるようなシステムのアクセスログを対象として利用するなどの前提が必要。
(後者はヘルスチェックがあるようなシステムであればクリアできるはず)


書いててかなり限定的な用途っぽいことに気づいたものの、誰か使うかもしれないので放流

2021年私の上を通り過ぎていったお酒たち

この記事は泥酔アドベントカレンダー31日目の記事です。
昨年に引き続きステイホームアンド酒をやっていたので、2021年に飲んで印象に残ったお酒をまとめておく。

ウイスキー

ザ・グレンリベット 12年

2021年はウイスキーに色々手を出した一年で、中でも王道系をちゃんと抑えていった。
味の分解能はそんなに高くないけどグレンフィディック洋梨でこっちは青りんごみたいな印象。
ロックでもいいしハイボール要員としてもよい。 item.rakuten.co.jp

十年明 Seven

5千円以下の国産ウイスキーを色々買ってた時期がありその中で見つけた1本。
どちらかというとピーティー系。春頃に出会って今年でもう3,4本飲んでいる。
46%と度数が高くハイボールにしてもおいしい。
item.rakuten.co.jp

グレンモーレンジ アルタ

ちょっといいウイスキーが飲みたくてオークションで購入したもの。1万円前後。
発酵過程で野生酵母を一部使ったウイスキーで、パンみたいな香りがした。
いいウイスキーは少しずつ飲むので開栓してからの味の変化も楽しめてよかった。
product.rakuten.co.jp

古めのジョニーウォーカー(赤,黒,Swing)

特級時代(1989年以前)のものが結構好きでちょくちょく買っている。
流通量が多いのでうまいことやるとオークションで一本1500円くらいで手に入る。
商品の写真から当たり外れを推測したり、実際飲んでみて確認する試行錯誤も楽しい。
蓋が金属のキャップなのでオールドボトル初心者にもおすすめできる(栓がコルクだと引きが悪いと開栓時に死ぬ)
page.auctions.yahoo.co.jp

ビール

Lupulin Nectar (YMARKET)

ビールに強い酒屋でまれに取り扱われている。
アルコール度数は7.5もあるものの、これでもかってくらい柑橘っぽくて飲みやすい。
美味しすぎて買い占めようとしたけど700円/本だったので3~4本にとどめた。
item.rakuten.co.jp

ELVIS JUICE (BrewDog)

原料としてホップ以外にグレープフルーツ、オレンジエキスが利用されている。
一口目からグレープフルーツのパンチがすごい。味が濃い目のつまみに合う。
同じBrewDogだとPUNK IPAはよく飲んでたもののこっちは知らなかった。
item.rakuten.co.jp

ねこぱんち (VECTOR BREWING)

社の人が買っていたのを見て気になって購入したけど、どれも軽くさっぱりしてて美味しい。
定番のねこぱんちに加えて何種類かレパートリーがあるセットを何度か購入している。
あとラベルがかわいい。
vectorbrewing.shop

日本酒

仙禽雪だるま

酸味と甘味のバランスがとれていて飲みやすく微発泡でするする行ける(そして死ぬ)
毎年11月12月1月の期間限定なのでそのタイミングを逃すと1年買えない。
日本酒好きな後輩に一升瓶送りつけたら一晩で半分飲んで死んでたらしいのでやはり危険。
item.rakuten.co.jp

紅熟 月桂冠

これまで飲んだ日本酒の中で一番甘かった。甘さの系統としてはリンゴ系なんだけどとにかく甘い。
オフィスにあったやつを飲んで感動して自分でも買い直した。限定ということもあって少し値が張る。
www.gekkeikan.co.jp

焼酎

天狗櫻 ジョイホワイト

薬品瓶みたいなカッコいい瓶に入った焼酎。
芋焼酎はあまり得意じゃなかったものの、甘く爽やかで飲みやすく芋焼酎に対する印象がガラリと変わった一本。
nomiyama-shuhan.shop


ビールはヘイジー系とか爽やか方向のものをかなり知ることができたのと
ウイスキー・焼酎でも自分にとって定番に近いものを見つけられたのがよかった。

肝臓と仲違いしない程度に来年も楽しく飲みたいですね。おわり。

1万円台で作れるIoTセンサでCO2と気圧をグラフ化する

温度や湿度の変化は変化を自覚してから不調が来るものの、気圧やCO2濃度の変化は不調が来てから(能動的に調べて)変化を知ることが多い。
去年2月から丸1年とちょっとフルリモートで働いているのだけど、やることは明確なものの何故か手が動かない時は内因として水分補給や血行の問題、外因では低気圧や部屋の換気が原因となっているケースが多かった。

一度気づいてからは定期的に対策するようにするのだけど、障害対応とか不具合調査で下手にフローに入ってしまうとそれも難しい。
なのでまずは検知しづらい生産性低下の外的要因を確認できるようにしたい!というモチベーションで気圧計やCO2濃度計を調達しようと思って1月頃から調べ始めたのだけど、業務用のCO2濃度計がとにかく高い。
わざわざ業務用で調べたのはAmazonで調べると怪しげな海外メーカーのCO2濃度計が投げ売りされていたりして不安になったのと、下記の記事を読んだから。

どうせ買うならちゃんと動作するものがほしいし、もちろんできれば安くで欲しい。
ということで無ければ作るの精神で自作することを決めた。

必要なもの

Raspberry Pi 4b 4GB ¥6,490
後々設定を変更したりしやすくするためにWifiがついてたらなんでも良いと思う。(長いので以下RPiと呼称する)
他の用途で遊ぶかもしれないなと思って少しスペックが高めのRPi4b 4GBモデルを買ったけど、今回の用途だけで利用するならスペック的にはRPi Zero WHくらいで良さそう。
入出力インターフェースは減るものの、Rpi Zero WHだと¥2,500くらいで入手できる。
https://www.amazon.co.jp/gp/product/B087TM3VRX

RPi用電源 ¥1,139
本体購入のときと一緒にAmazonでまとめて購入。多分もっと安く入手できそう。
https://www.amazon.co.jp/gp/product/B07DN5V3VN

microSD 32GB ¥851
本体購入のときと一緒にAmazonでまとめて購入。容量とかこだわりたい人はお好みで。
https://www.amazon.co.jp/gp/product/B06XSV23T1

ジャンパワイヤ(メス-メス) ¥380
半田付け無しで電子部品とRPiを接続するのに使う。
電子部品側もピンが用意されているものを買う必要があるので注意。
https://www.amazon.co.jp/gp/product/B01A4DDUTA

MH-Z19C (CO2センサ) ¥2,480
今回の重要部品その1。
値段がRPi Zero WHと同じくらいする。
https://akizukidenshi.com/catalog/g/gM-16142

SSCI-023238 (BME280 温湿度気圧センサ) ¥2,178
今回の重要部品その2。
この電子部品であれば温湿度も同時に取れるので採用。ピンを自分で半田付けする前提なら半額くらいで買える。
BME280で調べればSSCI-023238でなくとも同様のデータが取れる電子部品が大量に出てくるのでそちらでも代用可。
https://www.amazon.co.jp/gp/product/B07XYZZB5Q

必要に応じて

HDMI-microHDMIケーブル
RPiの初期セットアップに画面をつないで操作するために利用。
持ってたので今回の費用計上からは除外。初期セットアップを画面接続無しでやるなら不要かも。
https://www.amazon.co.jp/gp/product/B00HQY7XIU

microSDリーダー
RPiの起動イメージを書き込むために必要。
持ってたので今回の費用計上からは除外。
https://www.amazon.co.jp/gp/product/B0829KGK2F

この構成だとここまでで¥13,500前後。
RPi 4bをRPi Zero WHに変えたり、センサ系の部品をピン無しのものを買って自分で半田付けすれば¥8,000くらいにおさまるはず。
(その場合一番高い部品はCO2センサになる)

半田ごてとか道具が揃っていて、その辺の作業に抵抗ない(楽しめる)人はコスト的にそっちの方がよさそう。

セットアップ

RPi上で動作させるOSのセットアップ

Raspberry Pi Imagerという公式のツールがあるのでそれを利用する。
OSには色々種類があるものの、定番ぽいRaspbian Fullを選んで書き込み。

下記がとても参考になった。
dev.classmethod.jp

初期設定

モニタとUSBマウス/キーボードを繋いで、初期パスワードの設定。
後から調べたら最初からsshで起動できるように設定を編集することもできるらしい。

起動後、インターフェイスからSSH(VNC), I2C, シリアルポートを有効にする。
SSH(VNC)はRPiに画面を接続せずとも外部PCからアクセス出来るようにするため。I2C、シリアルポートは電子部品とのやりとりのため。
SSHで接続するには接続するPCとRPiが同じWifiに接続していれば ssh pi@raspberrypi.local で接続できる。

より具体的には下記の記事が参考になった。
パブリックなネットワークだと危険な気がするものの、家庭内LANなので一旦問題なしとしてすすめる。

dev.classmethod.jp

配線

f:id:uskey:20210314212708p:plain:w300

RPi [番号] と書かれたものはRPi上のGPIOピン上でのマッピング(参考)。
配線失敗すると基盤が死ぬこともあるらしいので注意する。
各ピンと電子部品間でどのような通信が動いてるか把握するのは後回し。
ネットを調べると先人達の知恵があるのでそれを元に配線を行う。

二酸化炭素センサ (MH-Z19)

取れる情報 : CO2, 気温(低精度)

RPi - MH-Z19間の接続
RPi 04(5V)  <-> Vin
RPi 06(GND) <-> GND
RPi 08(TXD) <-> RXD 
RPi 10(RXD) <-> TXD

Pythonから利用するためのスクリプトが存在していてpipからインストールできる。
(ソースは下記)

github.com

GithubのREADMEを眺めているとドキュメントされていない機能として気温が取れる、とのことなのでどうせなのでその値も取得してみる。

GPIOを利用するにはroot権限が必要になるためsudoをつけて実行する。
下記のように実行して値が返ってきたらok。

$ sudo pip install mh-z19
$ sudo python -m mh_z19 --all
{"SS": 0, "UhUl": 7936, "TT": 73, "co2": 688, "temperature": 33} 

室温がだいぶ上振れしていて精度が悪いように見えるものの気にせず進める。  

温湿度/気圧センサ (SSCI-023238 BME280)

取れる情報 : 気温, 湿度, 気圧

RPi - SSCI-023238間の接続
RPi01(3.3V) <-> Vio
------       <-> VCore
RPi 03(SDA)  <-> SDI
RPi 05(SCL)  <-> SCK
RPi 09(GND)  <-> GND
RPi 17(3.3V) <-> CSB
RPi 20(GND)  <-> SDO

メーカーのスイッチサイエンス社からPythonでデータを取得するサンプルプログラムが提供されているのでそちらを利用する

github.com

同様に下記のようにして動作確認をして値が返ってきたらok

$ wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py
$ sudo python bme280_sample.py
temp : 22.23  ℃
pressure : 1009.89 hPa
hum :  35.11

サンプルプログラムのままだと入力待ちを続けたり、出力が扱いづらいのでjsonで返すようにするなどよしなに整形する。
センサからデータを取得するスクリプトをPython2系で進めてしまっていることに気づいたが、後から差し替えもできるので一旦作りきってから改修することにして前に進める。

グラフ化

ここもスクリプト同様に外部のサービスを利用する。
IoT系のデータをいい感じに表示するサービスは複数あるものの、今回は無料で利用できて簡単なAmbientを利用する。

ambidata.io

ユーザー登録後、チャネルを作成してID, ライトキーを保存しておく。
また、Python用のモジュールが用意されているので導入しておく。

$ sudo pip install git+https://github.com/AmbientDataInc/ambient-python-lib.git

Ambientに保存するデータ量・更新頻度の制限については公式のspecに記載があり

- 1ユーザーあたり8個までチャネルを生成できます。
- 1チャネルあたり8種類のデーターを送信できます。
- 送信から次の送信まではチャネルごとに最低5秒空ける必要があります。それより短い間隔で送信したものは無視されます。
- 1チャネルあたり1日3,000件までデーターを登録できます。平均すると28.8秒に1回のペースです。
  - bulk_send()やnode.js、Pythonで複数件のデーターを一括登録する場合、APIのコール回数は1回ですが、データー登録は複数件とカウントされます。
  - 件数のカウントは0時に0クリアされます。
  - チャネルデーターを削除しても1日の登録件数のカウントは0クリアされません。
- 1チャネルあたり8個までチャートを生成できます。
- データーの保存期間は1年間です。

とのこと。

一回の書き込みAPIアクセスで1セット8種類のデータを送信することが出来るため、一度に送信するデータの種類を増やすと送信可能な回数が減るかと思ったものの、実際には1日3000データではなく1日3000セットが制限だったため今回のセンサ分(5種類)は問題なし。
無料でこれだけ使えてデータが1年残るのはかなり太っ腹だと思う。

Ambientに登録する処理の実装

MH-Z19, BME280からデータを取得してAmbientに登録する下記のようなスクリプトを作成する。
channel_id, write_keyは先程登録した際に保存しておいたものを利用する。 (import bme280 としているものは先のサンプルプログラムをいい感じに修正したもの)

import datetime
import mh_z19
import ambient
import bme280
  
mhz19res  = mh_z19.read_all();
bme280res = bme280.readData();
  
if 'co2' in mhz19res :
    am = ambient.Ambient(channel_id, write_key)
    status = am.send({'d1' : mhz19res['co2'], 'd2' : mhz19res['temperature'], 'd3' : bme280res['temperature'], 'd4' : bme280res['pressure'], 'd5' : bme280res['hum']}, 60)

データの登録に成功しているとAmbientのチャネルでは下記のように表示される。
f:id:uskey:20210314194208p:plain:w400

それぞれのデータに対してはまだ名前がついていないため、適切な名前をつけたりチャート表示の変更を行う。

定期実行

スクリプトからAmbientへのデータ登録の確認ができれば、いよいよ時系列グラフ描画のために定期実行の設定をしたい。

先程のスペックから''平均すると28.8秒に1回のペースです'' とのことなのでその制限に触れない30秒毎にデータを送信する。
(crontabでは指定できる最小単位が分なので、即実行するものとは別に30秒待ってから実行する設定を行う)

$ crontab -e

* * * * * sudo python ~/monitor.py
* * * * * sleep 30; sudo python ~/monitor.py

正しく動作していればAmbient側で下記のようにグラフ表示が行われる。
(データやチャネルへの名前設定などは別途設定済み)
f:id:uskey:20210314195009p:plain:w400

このボードは設定によって全体公開にすることも可能で、試しに全体公開した家の作業部屋のボードが下記。

https://ambidata.io/bd/board.html?id=23516

人間が部屋にいて作業をしているとCO2がじわじわ上がっていったり、エアコンをつけると気温/湿度が周期的に変化したりなど様々な傾向が見て取れて面白い。
また、RPiの電源が落ちているなどの要因でデータの登録に間隔が空くとその部分は直線になるのでわかりやすい。
(MH-Z19から取れる気温は小数点以下の精度が無く、20℃を超えると誤差がすごい(5℃以上上振れする)のであまり当てにしてはいけない。仕様書に載ってない機能なのでそれはそう。)

まとめ

学生時代は半田付けが苦手だったり、自作したLANケーブルが自分のものだけ疎通しなかったりと散々だった(特別研究の担当職員に「しろめ君はそこそこプログラム書けるのに手先不器用だねえ!」と爆笑された記憶がある)ものの、センサ類からの値の読み出しはに手なりで書けるPythonを使えたり、処理の定期実行にcrontabが使えたりと普段仕事でLinux環境を利用している人ならなんとなくで利用できちゃうので電子工作に抵抗感がある人でもそんなに気合を入れなくても構築出来て満足感が高い。
(セットアップから最初のセンサをつないで値を読み出すまで1時間もかからなかった)

ちょっとお金を出してよく出来た既製品を買ってもデータを簡単に外部連携出来るモデルはあまりないし(しかも業務用だとべらぼうに値段が上がる)、少しでもプログラミングの経験があればとっつきやすいためエンジニアリングが好きな人にはおすすめ出来そう。
一方で、ちゃんとしたケースを作る。電源をバッテリ駆動にする。などを考え始めると沼にハマりそうなので一定の注意が必要。沼を覗いてる時沼もお前を覗いている。

他にも色々できそうなので時々やっていきたいですね。
おわり。

2020年振り返り

心を2020年に置いてきてしまって、未だに年末の気分が抜けていない。
2020年ときちんとお別れをするために色々思い出しながら振り返りと今後についてまとめる。

副業

2020年は1月から4月にかけて本業で色々考えさせられることがあって、今と違う環境や違うタイプの仕事に携わってみたいな〜と考えていた折に、タイミングよく友人の伝手で仕事の紹介がありそのうちいくつかの案件に参加させてもらった。

あらかじめ決まった範囲の対応を行って完了とするようなスポットタイプの案件を3件と、業務委託契約を結んで時間報酬で継続的にコミットするような副業を1社関わることができて、ちょうどよいくらいの割合で普段使わないインフラや開発言語、その他ツールに関わることができて知的好奇心や技術的な視野の広さや深さを得ることができて非常に良かった。

一方で副業の内容や契約にもよるものの、本業だけをやっている場合と比べて確実に思考リソースや時間がとられてしまうため、諸々コントロールが難しくなるのと本業と副業で忙しいタイミングの波が重なると非常に厳しい状態になるため注意が必要と感じた。

今現在受けている内容についてキリのよいところまで対応が終わったら、受ける仕事を絞って読書や趣味の開発など自己研鑽方向にある程度時間を割けるようにしたいと考えている。

コーヒー

春頃に古くからの友人に手動のコーヒーミルをもらって、そこから諸々買い揃えて自分で豆を挽いてコーヒーを飲むようになった。
最初はなんとなく挽いた豆で抽出して、おいしい!たのしい!大好き!
のような状態だったのが、抽出時の温度に再現性を持たせるために温度調節機能つきのケトルを買ったり、手動のミルだと挽く度に少しずつ挽目が変わってしまうので電動のミルを買ったりと分かりやすく沼に浸かってしまった。

f:id:uskey:20210113014829j:plain:w500

料理と同様に工夫したり変更した部分のフィードバックが自分の味覚や嗅覚で戻ってくるため、うまくいったときの満足度が非常に高いのと、ある程度のところまで行くと既製品との競争が始まるのでやりこみの幅が圧倒的に広い。スタバに勝ちたい。

開発

本業だと開発というよりドキュメントをわっと作ったり、調査系タスクが多かったためがっつり手を動かしてコードを書いたのは副業と検証系のコードがメインだった。
その過程でいくつかブログ記事にまとめたり、OSSにも小粒なPRを出してマージされた。

github.com

github.com

github.com

ただ、例によって細かな不具合修正であったりドキュメント追加みたいなものが多かったため、2021年は小さくても完結した機能を提供するようなツールを作ったりしていこうと思う。

引っ越し

コロナ禍で2020/02頃からほぼフルリモートで在宅勤務になっていたものの、住んでた家が1Kで流石に厳しくなってきたので夏頃からゆるゆると物件探しを開始した。
予算に収まってかつ条件が良いところを探すと全然見つからないため11月までずれ込んだ上、引越し業者を探したり粗大ゴミを新居に一部持っていったりと超バタバタになったものの12月に引っ越しが終わった。
(写真は旧居)

f:id:uskey:20210113014835j:plain:w500

面積が倍以上になったため端的にめちゃめちゃ過ごしやすく、あと2~3年くらいは在宅勤務で戦えそうな感じになった。早くやればよかったですねとは思うものの、副業である程度蓄えができたから踏み切れた部分もあるので難しい。
部屋が広くなったのに合わせて家具家電の追加が必要になって出費がすごいことになったため、意識的に生活レベルを落としている。つらい。

まとめ

他にも自炊に目覚めてある日いきなり野菜を5kgとか買って持て余したり、ハチャメチャにかわいい甥っ子が生まれて名実ともにおじさんになったり、尊敬していた先輩・同僚が2連続で辞めちゃったり、気の迷いで某仮想通貨に突っ込んだチョット万円が3倍になった後にもとに戻ったのを見てゲラゲラ笑ったり、思い返すと割と色々なことがあってコロナ禍でこれまで通りに外出できなくなった割には濃く充実した1年だった。

それで、色々なことをする機会や縁に恵まれた1年で実際色々なことに挑戦してみた反面、何かこれといったひとかたまりの進捗や成果は出なかったように感じるので、2021年は色々な挑戦をしつつも進捗を発散させるのではなく指向性を持って積み上げるような1年にしたいと思う。

がんばるぞ。

AmazonLinuxでカーネルバージョンをダウングレードする

脆弱性の検証に利用する場合や、そこまで積極的な用途でなくとも
一部ソフトウェアでは互換性のあるカーネルバージョンが明確に指定されているケースがある。

その場合現在より古いカーネルバージョンを明示的に指定して利用したい。
手順を調べたのでまとめる。

手順

  • 古いカーネルを導入する
  • デフォルトカーネルを差し替えて再起動する
  • (Optional) アップデート対象からカーネル関連モジュールを除外する

古いカーネルを導入する

まずは現時点でのカーネルバージョンを確認する。

# uname -a
Linux ip-172-31-23-7.ap-northeast-1.compute.internal 4.14.193-149.317.amzn2.x86_64 #1 SMP Thu Sep 3 19:04:44 UTC 2020 x86_64 x86_64 x86_64 GNU/Linu

# grubby --default-kernel
/boot/vmlinuz-4.14.193-149.317.amzn2.x86_64

現状では4.14.193-149.317.amzn2が導入されているようだ。

今回はカーネルバージョンkernel-4.9.85-47.59.amzn2を指定して導入する。

# yum install kernel-4.9.85-47.59.amzn2
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                          | 3.7 kB  00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel.x86_64 0:4.9.85-47.59.amzn2 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================================
 Package                              アーキテクチャー                     バージョン                                       リポジトリー                              容量
===========================================================================================================================================================================
インストール中:
 kernel                               x86_64                               4.9.85-47.59.amzn2                               amzn2-core                                17 M

トランザクションの要約
===========================================================================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 17 M
インストール容量: 75 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
kernel-4.9.85-47.59.amzn2.x86_64.rpm                                                                                                                |  17 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : kernel-4.9.85-47.59.amzn2.x86_64                                                                                                           1/1
  検証中                  : kernel-4.9.85-47.59.amzn2.x86_64                                                                                                           1/1

インストール:
  kernel.x86_64 0:4.9.85-47.59.amzn2

完了しました!

(必要であれば) デフォルトカーネルを差し替える

AMIの仮想化タイプによってはカーネルをインストール後に手動でデフォルトカーネルを変更する必要がある。
(HVMではなくPVと呼ばれるタイプの仮想化タイプでは手動での変更が必要)

# grubby --default-kernel
/boot/vmlinuz-4.9.85-47.59.amzn2.x86_64

今回はインストールされたカーネルがデフォルトカーネルになっているため、そのまま再起動。

# reboot now

(Optional) アップデート対象からカーネル関連モジュールを除外する

検証などに利用するために短期的に利用するだけであれば以下の作業は不要。
本来であれば脆弱性などの問題があるため推奨されない。あくまで自己責任で。

現状は4.14.193-149.317.amzn24.9.85-47.59.amzn2がインストール済みとなっている。

最新カーネルのバージョンが上がった際にyum updateでカーネルが更新されないように設定を行う。
検証のために新しい方(4.14.193-149.317.amzn2)を削除する。

# uname -a
Linux ip-172-31-23-7.ap-northeast-1.compute.internal 4.9.85-47.59.amzn2.x86_64 #1 SMP Wed Mar 14 21:51:55 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# grubby --default-kernel
/boot/vmlinuz-4.9.85-47.59.amzn2.x86_64

# ls -al /boot/
合計 75976
dr-xr-xr-x  4 root root     4096 10月 23 18:29 .
dr-xr-xr-x 18 root root      257 10月 23 18:21 ..
-rw-r--r--  1 root root      174  9月  3 19:06 .vmlinuz-4.14.193-149.317.amzn2.x86_64.hmac
-rw-r--r--  1 root root      170  3月 14  2018 .vmlinuz-4.9.85-47.59.amzn2.x86_64.hmac
-rw-------  1 root root  2829664  9月  3 19:06 System.map-4.14.193-149.317.amzn2.x86_64
-rw-------  1 root root  2900199  3月 14  2018 System.map-4.9.85-47.59.amzn2.x86_64
-rw-r--r--  1 root root   120243  9月  3 19:06 config-4.14.193-149.317.amzn2.x86_64
-rw-r--r--  1 root root   104187  3月 14  2018 config-4.9.85-47.59.amzn2.x86_64
drwxr-xr-x  3 root root       17  9月 21 21:10 efi
drwx------  5 root root       79 10月 23 18:29 grub2
-rw-------  1 root root 31826017  9月 21 21:12 initramfs-4.14.193-149.317.amzn2.x86_64.img
-rw-------  1 root root 28205290 10月 23 18:29 initramfs-4.9.85-47.59.amzn2.x86_64.img
-rw-r--r--  1 root root   669043  9月 21 21:12 initrd-plymouth.img
-rw-r--r--  1 root root   235508  9月  3 19:07 symvers-4.14.193-149.317.amzn2.x86_64.gz
-rw-r--r--  1 root root   202798  3月 14  2018 symvers-4.9.85-47.59.amzn2.x86_64.gz
-rwxr-xr-x  1 root root  5727184  9月  3 19:06 vmlinuz-4.14.193-149.317.amzn2.x86_64
-rwxr-xr-x  1 root root  4936688  3月 14  2018 vmlinuz-4.9.85-47.59.amzn2.x86_64

# yum remove kernel-4.14.193-149.317.amzn2
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel.x86_64 0:4.14.193-149.317.amzn2 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================================
 Package                             アーキテクチャー                    バージョン                                           リポジトリー                            容量
===========================================================================================================================================================================
削除中:
 kernel                              x86_64                              4.14.193-149.317.amzn2                               installed                              101 M

トランザクションの要約
===========================================================================================================================================================================
削除  1 パッケージ

インストール容量: 101 M
上記の処理を行います。よろしいでしょうか? [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : kernel-4.14.193-149.317.amzn2.x86_64                                                                                                       1/1
  検証中                  : kernel-4.14.193-149.317.amzn2.x86_64                                                                                                       1/1

削除しました:
  kernel.x86_64 0:4.14.193-149.317.amzn2

完了しました!

yum list updatesで削除した最新カーネルがリストされることを確認する。

# yum list updates
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
更新したパッケージ
awscli.noarch                                                                         1.18.147-1.amzn2.0.1                                                       amzn2-core
ec2-net-utils.noarch                                                                  1.4-3.amzn2                                                                amzn2-core
kernel.x86_64                                                                         4.14.198-152.320.amzn2                                                     amzn2-core
kernel-tools.x86_64                                                                   4.14.198-152.320.amzn2                                                     amzn2-core
p11-kit.x86_64                                                                        0.23.21-2.amzn2.0.1                                                        amzn2-core
p11-kit-trust.x86_64                                                                  0.23.21-2.amzn2.0.1                                                        amzn2-core
pam.x86_64                                                                            1.1.8-23.amzn2.0.1                                                         amzn2-core
python2-botocore.noarch                                                               1.18.6-1.amzn2.0.1                                                         amzn2-core
python2-rpm.x86_64                                                                    4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm.x86_64                                                                            4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm-build-libs.x86_64                                                                 4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm-libs.x86_64                                                                       4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm-plugin-systemd-inhibit.x86_64                                                     4.11.3-40.amzn2.0.5                                                        amzn2-core

初期に入っていた4.14.193-149.317.amzn2から4.14.198-152.320.amzn2に上がってしまっているが
古いカーネルを利用している状態だと、kernel関連のモジュールがアップデート対象に含まれることが確認できた。

このままだとyum updateしたタイミングでカーネルのバージョンが上がってしまうため
/etc/yum.confの[main]配下にexclude=kernel*を追加し、アップデート対象から除外する。

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3
distroverpkg=system-release
timeout=5
retries=7
exclude=kernel* # ←ここ

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

更新後再度確認を行う。

# yum list updates
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                          | 3.7 kB  00:00:00
amzn2extra-docker                                                                                                                                   | 3.0 kB  00:00:00
更新したパッケージ
awscli.noarch                                                                          1.18.147-1.amzn2.0.1                                                      amzn2-core
ec2-net-utils.noarch                                                                   1.4-3.amzn2                                                               amzn2-core
p11-kit.x86_64                                                                         0.23.21-2.amzn2.0.1                                                       amzn2-core
p11-kit-trust.x86_64                                                                   0.23.21-2.amzn2.0.1                                                       amzn2-core
pam.x86_64                                                                             1.1.8-23.amzn2.0.1                                                        amzn2-core
python2-botocore.noarch                                                                1.18.6-1.amzn2.0.1                                                        amzn2-core
python2-rpm.x86_64                                                                     4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm.x86_64                                                                             4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm-build-libs.x86_64                                                                  4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm-libs.x86_64                                                                        4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm-plugin-systemd-inhibit.x86_64                                                      4.11.3-40.amzn2.0.5                                                       amzn2-core

kernel.x86_64,kernel-tools.x86_64がリストされなくなった。
(本来は良くないが)これで古いカーネルを利用し続けることができる。