Tocyukiのブログ

ギターと柔術とプログラミングが好き!

2023年の振り返りと2024年の抱負

油断していたら2022年の振り返りをすっ飛ばし、2023年の振り返り記事を上げる前に年を越してしまった。 ここ数年は個人的にかなり濃密な日々となっているのでしっかり振り返って、来年の抱負も掲げてしっかりやっていきたい。

過去の振り返りとか見ていると、かなり忘れている出来事も多く、そして掲げた目標もほぼ達成できてなくてなんて適当なやつなんだと笑えてくるが日々楽しく幸せな人生を過ごせているし、奥さんとも仲良しだし、着実に成長も実感出来ているし、2023年も大いに飛躍出来た一年となった(?)のでヨシ!!!

しかし自分は本当にある意味場当たり的に一生懸命生きている運の良いだけの人間なのだなぁと痛感し、持たざる者であることを自覚し、これからもできる範囲で頑張らないといけないなぁ、という気持ち(ガンバレ

blog.tocyuki.com

blog.tocyuki.com

2023年振り返り

まず仕事、登壇&コミュニティ活動という切り口で出来事やイベントを羅列し、それぞれ印象的な出来事を中心に深掘りながら最後に総括という形で全体を振り返っていこうと思います!

仕事

  • CES参加に伴うアメリカ出張(1月)
  • チーム合宿と称してトスラブ箱根和奏林でワーケーション(5月)
  • イオンスマートテクノロジー社へ転職(8月)
  • グループ会社視察に伴う中国出張(9月)
  • テックブログ開設&DevRel立ち上げ(9月)
  • MS Ignite Japan recap参加に伴う大阪出張(12月)
  • アドベントカレンダー実施(12月)

年始早々(1/3〜1/9)CES視察と称した自身初となるアメリカを出張という形で訪れることになった。 これも初となるホノルルで10時間以上あるトランジットを正月からヨットで回遊しながら休憩ポイントでは船上でハンバーガーを作って食べたり海で泳いだりして満喫し、そこからLAへ行きグランドキャニオンのツアーへ参加したり、戻ってからは初カジノで$1,100勝ちからの$500負けでフィニッシュしたり、CESへも参加したり、シルクドソレイユの「O」を観覧したり、フェニックスではWaymo、サンフランシスコではGMクルーズのレベル4自動運転による無人タクシーを体験したりと本当に色々と貴重な体験をすることが出来た。

また2023年はIT健保のレストラン巡りと保養施設でのワーケーションがQOLを高めてくれた。特にIT健保寿司として名高い「一新」や和食レストラン「木都里亭」とチーム合宿と称して行ったトスラブ箱根和奏林はめちゃくちゃ良かった。IT健保加入してるエンジニア諸氏におかれては是非訪れてほしい。

IT健保の素晴らしいレストラン、保養施設について、また活用戦略については前職のマイメンが記事を書いてくれているのでこちらも是非参考にしてほしい。

tech.trustbank.co.jp

2023年最大のイベントは何と言ってもやはり転職だった。

前述の通り、8月にイオンスマートテクノロジー社へCTOのリファラルで転職した。

SREとしてはチームの状態を整えるために詳しくは書けないが色々と精神をすり減らしながら奔走した5ヶ月だった。 中々の苦行だったが種まきを何とか年内に終わらせることが出来たので、2024年はしっかりと成果を上げていきたい。

詳細が気になる方は飲みに誘っていただければベラベラ喋ると思いますのでお誘いお待ちしております🍺

また、中に入ってみて内部への働きかけより外部からのプレゼンスを高めることが色々と近道だと判断し、テックブログやDevRelチームの立ち上げ、アドベントカレンダーの実施などにチャレンジをした結果、これらの活動を通じてエンジニア組織としてのプレゼンスをかなり高めることができた。 特にDevRelチームは増幅拡大の装置としては申し分ない機能を持たせることができたので、今年は採用活動と組織改革を本格的に推進していき強固な地盤固めを行う一年としていきたい。

関連記事は以下

qiita.com

qiita.com

zenn.dev

俺の役割 is 何?という風に感じられる方もいると思うが、前向きな言い方をすると必要なことであれば何でもやれるフェーズであるということです。

登壇・コミュニティ活動

2023年はコミュニティ活動を通じて色々な人と接点を持ったり仲を深める事ができた。 今までコミュニティに関わることで人生が変わった、というような人の話を聞く事がよくあったが、昨年はまさに自分の人生も様々なコミュニティを通じて拡張されていく感覚があった。 今では自分の言葉として「コミュニティに関わることで人生が変わった」と言えるようになったと思う。

ハイライトとしてはCloudflare Meetup Naganoを主催(?)し、長野の技術コミュニティの方々と繋がることが出来たり、NRUG SRE支部メンバーで共著で書籍を出版したり、JAWS-UG コンテナ支部 #24 ecspresso MeetUpでは敬愛するfujiwaraさんやsongmuさんと一緒にお酒を飲んだり、Cloud in the Camp 勝浦で色々な人と交流できたあたりだと思う。

また例年よりも多くの様々なイベント(登壇や主催以外の)へオンライン、オフライン問わず参加したような気がする。

引き続き自分の人生をより豊かにし、学びを得るため、また還元するためにも積極的にコミュニティ活動やイベントへ参加して行こうと思う。

総括

2022年もそうだったが、2023年も本当にイベントや変化の多い一年になった。

なんと言っても転職したことによる変化が一番大きかったが、仕事的にはこの一年で初めてアメリカと中国へ海外出張に行ったり、本を出版したり、ワーケーションと称して伝説のトスラブ箱根和奏林に行ったり(マジ最高だった)、プライベートでは千葉と四国へ家族旅行したり、消防団やサッカーのコーチを始めたり、マイカーを購入したりと人生においても記憶に残るであろう良い経験となるイベントが目白押しでとても良い一年となった。

転職して大変な時期もあったりしたが、あの手この手でなんとか光が見える状況にはなって来たので今年は方針策定して大きな成果を創出していきたい。

ここ数年は仕事のみならず自分の戦略・戦術がハマることが多いのだがディテールが甘かったり大雑把な部分は散見されるのでそういった部分は改善していき、より良い人生を歩めていけるように精進していきたい。

2024年の抱負

個人的な今年の抱負としては以下についてそれぞれ習慣化のための施策を遂行できるように頑張っていきたい。 2024年は継続力をキーワードに習慣化を進めていきたい(自信ないけど)

  • 読書
  • フォーカスすべき技術領域の学習
  • 英語学習
  • 健康

全体の共通施策として「毎週日曜に振り返りと計画を行う」ことを継続していきたい。

読書

主に技術書が対象になると思うが、以下のような施策をしっかりと遂行していきたい。

  • 計画的な積読消化による読書の習慣化
  • アウトプット駆動読書
  • 輪読会の開催

後述するフォーカスすべき技術領域の学習にも関係するが、年間でどれぐらい何を読むかをある程度計画し、読み終わったら書評を書くなどアウトプットとセットで読むようにする。 また、会社のメンバーを巻き込んで輪読会を実施しチーミングも兼ねて相互で学習する仕組みを作り上げる。

読書管理にはブクログを活用するようにする。

booklog.jp

フォーカスすべき技術領域の学習

自分は今までなんでもできるようになりたいという気持ちが強く、学習対象もかなり散漫だったが今後は明確に以下の領域に絞り、Infra/DevOps/SRE/PlatformEngineering領域を強みとしたエンジニアとしてしっかり市場価値も上げていき、会社・事業にもコミットしていきたい。

  • Golang
  • Kubernetes
  • DevOps
  • SRE
  • PlatformEngineering

どのように学習していくかは基本的にはインプットとアウトプットになるわけだが、その主軸は以下だ。

  • 技術書、ハンズオン、実践を通したインプット
  • ブログ、登壇などによるアウトプット

すでに今年もデブサミへの登壇も決まっていたり、TiUGやAEON Tech Talkなどのイベント開催も予定しているのでそれらのイベントやSRE Next、PlatformEngineeringMeetup、CNDTなど大きなカンファレンスでの登壇にもどんどん挑戦していきたい。

event.shoeisha.jp

tiug.connpass.com

そして今年はISUCONにも挑戦したい!!

英語学習

月並みだが以下のアプリでの学習を毎日やる!

  • Duolingo
  • ELSA Speak
  • iKnow

健康

とりあえず意識しながら無理せずという感じで頑張りたい。

  • コーチ業では意識して動く
  • 息子とのサッカー練習では自分の運動も兼ねてやる
  • 毎日ストレッチする
  • 毎日体重を測る

おわりに

とまぁ、こんな感じで雑に振り返ってみたり抱負を述べたりしましたが意味があるかどうかは今後の自分次第だけど良い機会にはなったので引き続き今を一生懸命生きつつ、ほどほどに頑張りたいと思います!

2月には納車、6月には4人目となる子供が産まれる予定(!?)なので今年もイベント目白押しな予感!!

Azure Kubernetes Service関連で役立ちそうなリンク集

色々教えてもらったので備忘録

Microsoftラーニングパス

製品欄のAzure Kubernetes Serviceにチェックをいれた状態のURL

learn.microsoft.com

AKSクラスターのB/Gデプロイ

learn.microsoft.com

API の破壊的変更時に Azure Kubernetes Service (AKS) クラスターのアップグレードを自動的に停止する

非推奨のAPIの使用を確認できるKubernetes API deprecationsが便利そう

learn.microsoft.com

AKSリリーストラッカー

AKS は、すべてのクラスターと顧客に影響を与える一連の修正プログラム、および機能とコンポーネントの更新プログラムを毎週リリースします。 ただし、これらのリリースは、Azure の安全なデプロイ プラクティス (SDP) により、最初の出荷時点からすべてのリージョンに展開されるまで最大 2 週間かかることがあります。 お客様のリージョンが特定の AKS リリースの対象となっている場合にそれを把握することが重要であり、AKS リリース トラッカーは、これらの詳細をバージョンとリージョン別にリアルタイムで提供します。

learn.microsoft.com

AKS CHANGELOG

定期的に読むと良さそう

github.com

AKS Release Note

日本語化されているものがオススメ

zenn.dev

AKS B/GデプロイのTerraformサンプルコード

MS真壁さん作

github.com

Azure Kubernetes Services のトラブルシューティング に関するドキュメント

learn.microsoft.com

KubernetesにArgoCDをセットアップする

blog.tocyuki.com

とりあえずAKSのセットアップができたのでArgoCDをデプロイしてみる

とはいえ基本的には公式に記載されていることをするだけでデプロイできた(k8sすごい)

argo-cd.readthedocs.io

$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

お手軽に接続して確認するためにPortFowardingを実施

$ kubectl port-forward svc/argocd-server -n argocd 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

https://localhost:8080/ へ接続するとArgoCDのログイン画面が表示されることを確認

ArgoCDのログイン画面

argocdコマンドで初期パスワードを取得する

$ argocd admin initial-password -n argocd
XXXXXXXXXXXXXXX ←ここに初期パスワードが表示される

 This password must be only used for first time login. We strongly recommend you update the password using `argocd account update-password`.

先ほど取得したパスワードとadminユーザーを入力してログインできた

ArgoCDログイン後の画面

SRE文脈で読むと良さそうな書籍

SRE文脈な書籍が増えてきたので読んでおくと良さそうなやつを主に以下の分類でピックアップしておく

  • SRE
  • DevOps
  • 運用監視
  • 組織論

SRE

Google SREシリーズ

主著者/寄稿者が(ex-)Google SRE含む

その他

DevOps

運用監視

組織論

おわりに

SRE文脈とは?という感じではあるがSREというロールでいるのであればこのあたりは一通り読んでおきたい(読んでいるとは言っていない)

アーキテクチャ関連書籍はこちらにまとめたのでどぞ blog.tocyuki.com

Macの初期セットアップでやること

ここ2〜3年で検証機なんだかんだ6台ほど新しいMacをセットアップすることがあり、Macの初期セットアップ大体同じことやってるのでなんとなくメモしておく

トラックパッド&キーボード

以下設定する

トラックパッドのスクロール方向変更

自分は現在のデフォルトのスクロール方向とは逆に慣れてしまっているのでまずここを直します

トラックパッドの設定画面から変更する

三本指によるドラッグ有効化

これもめちゃくちゃ便利なので必ず有効化してるんですが微妙に分かりづらい場所に設定が会って毎回一瞬「あれ?どこだっけ?」となるやつ

アクセシビリティ>ポインタコントロール>トラックパッドオプションから変更

ドラッグにトラックパッドを使用にチェック、ドラッグ方法に3本指のドラッグを選択

caps lock^(control)へ変更

使うことない&HHKBのキー配置に合わせて変更

キーボード>キーボードショートカットから設定

修飾キーから変更

感度系

キーボード、スクロールなどなどの感度系を最速にしておく

リピート速度&入力認識の時間を最速に

軌跡の速さを最速に

dotfilesリポジトリ

dotfilesリポジトリを運用しているのでこいつをgit cloneしてタスクランナーであるMakefileで諸々実行して必要なアプリや設定をする

github.com

iTerm2

ログインシェル変更&tmux自動起動

自分はシェルにtmux&fishを使っている使ってるので設定していく

GeneralのCommandで設定

おわりに

dotfiles&ansibleによる構成管理をしているため結構楽にセットアップできてるので良きだなぁと改めて思うなどした

Azure Kubernetes Serviceへ手元のMacからkubectl実行する

というわけで(?)Azureなんもわからんマンなのでazure-clikubectlで手元から構築したKubernetes Clusterへの接続方法をメモしておきます。

Azure CLIでAzureへログイン

$ az login

サブスクリプションを設定

サブスクリプション一覧を表示して対象となるサブスクリプション名 or サブスクリプションIDを取得

$ az account list -o table

取得したサブスクリプション名 or サブスクリプションIDを指定してサブスクリプションを設定

$ az account set --subscription <サブスクリプション名 or サブスクリプションID>

AKS認証設定

AKSクラスタ名とリソースグループ名を取得

$ az aks list --output table

取得したAKSクラスタ名とリソースグループ名を使って認証する

$ az aks get-credentials --resource-group <resource_group_name>  --name <cluster_name>

kubectl実行

あとは各種kubectlコマンドを実行するだけなので試しにNginxでもデプロイしてみる

$ kubectl apply -f https://k8s.io/examples/controllers/nginx-deployment.yaml

Podが起動してくるか確認

$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-cbdccf466-44bws   1/1     Running   0          69s
nginx-deployment-cbdccf466-5lr6d   1/1     Running   0          69s
nginx-deployment-cbdccf466-cl2l6   1/1     Running   0          69s

よし、起動した

アーキテクチャ関連で読みたい書籍

色々なアーキテクチャを勉強するにあたり、とりあえずこのあたりは読んでおくと良さそうという書籍をピックアップ(全部読んだとは言っていない)

ソフトウェアアーキテクチャ関連

DDD/クリーンアーキテクチャ関連

マイクロサービス関連

JetBrains系IDEのIdeaVimプラグインでNERDTreeが使えるだと!?

というわけで普段はIntellijIDEAをメインに使っているんですが、元々Vimをメインで使っていたのでもちろんIdeaVimプラグインは使っていました。

ファイラーの扱いだけちょっとなーと思っていたんですが、使っているキーボードのカスタムキーバインドでなんとかやっていたところNERDTreeのキーバインド使えるんかいとなったので導入したのでそのメモ書きとして残しておきます。

使い方

基本的には以下に記載があるので要参照。

github.com

サポートしているコマンド

コマンド 説明
:NERDTree カレントディレクトリのツリー表示を開く
:NERDTreeFocus NERDTreeウィンドウにフォーカスを移動する
:NERDTreeToggle NERDTreeウィンドウの表示と非表示を切り替える
:NERDTreeClose NERDTreeウィンドウを閉じる
:NERDTreeFind 現在開いているファイルをNERDTreeウィンドウ内で見つける
:NERDTreeRefreshRoot NERDTreeウィンドウのルートディレクトリを再描画する

キーバインド

キー 説明 マップ設定
o ファイル、ディレクトリ、ブックマークを開く g:NERDTreeMapActivateNode
go 選択したファイルを開くが、カーソルはNERDTreeに残る g:NERDTreeMapPreview
t 選択したノード/ブックマークを新しいタブで開く g:NERDTreeMapOpenInTab
T 't'と同じ操作を行うが、現在のタブにフォーカスを保つ g:NERDTreeMapOpenInTabSilent
i 選択したファイルを分割ウィンドウで開く g:NERDTreeMapOpenSplit
gi 'i'と同じ操作を行うが、カーソルはNERDTreeに残る g:NERDTreeMapPreviewSplit
s 選択したファイルを新しいvsplitで開く g:NERDTreeMapOpenVSplit
gs 's'と同じ操作を行うが、カーソルはNERDTreeに残る g:NERDTreeMapPreviewVSplit
O 選択したディレクトリを再帰的に開く g:NERDTreeMapOpenRecursively
x 現在のノードの親を閉じる g:NERDTreeMapCloseDir
X 現在のノードのすべての子を再帰的に閉じる g:NERDTreeMapCloseChildren
P ルートノードにジャンプする g:NERDTreeMapJumpRoot
p 現在のノードの親にジャンプする g:NERDTreeMapJumpParent
K 現在のツリーの深さでディレクトリの内部にジャンプする g:NERDTreeMapJumpFirstChild
J 現在のツリーの深さでディレクトリの内部にジャンプする g:NERDTreeMapJumpLastChild
<C-J> 現在の階層から次の同階層にジャンプする g:NERDTreeMapJumpNextSibling
<C-K> 現在の階層から前の同階層にジャンプする g:NERDTreeMapJumpPrevSibling
r 現在のディレクトリを再帰的に更新する g:NERDTreeMapRefresh
R 現在のルートを再帰的に更新する g:NERDTreeMapRefreshRoot
m NERDTreeのメニューを表示する(右クリックしたときと同じ) g:NERDTreeMapMenu
q NERDTreeウィンドウを閉じる g:NERDTreeMapQuit
A NERDTreeウィンドウのズーム(最大化/最小化)を切り替える g:NERDTreeMapToggleZoom

おわりに

ファイラーの扱いがずっともやもやしていたのでこれでより快適なIntellijIDEAライフを送れそう🫶

EBSボリューム拡張

N億年ぶりにディスク拡張したので備忘録

環境

  • Ubuntu 18.04.2 LTS x86_64
  • EC2

手順

概要

  • EBSボリューム拡張
  • OSにボリュームを認識させる
  • ファイルシステムを拡張する

EBSボリューム拡張

AWSのマネコンから実施

EC2インスタンスを選択してストレージタブからEBSボリュームIDを選択

EBSボリュームを選択してアクションからサイズを変更する

OSにボリュームを認識させる

現状を確認

ubuntu@ip-10-0-8-197:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           393M  792K  393M   1% /run
/dev/xvda1      7.6G  1.3G  6.3G  18% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/xvda15     105M  5.2M  100M   5% /boot/efi
/dev/loop0       54M   54M     0 100% /snap/snapd/19122
/dev/loop1       56M   56M     0 100% /snap/core18/2751
/dev/loop2       25M   25M     0 100% /snap/amazon-ssm-agent/6563
tmpfs           393M     0  393M   0% /run/user/1000

grwpartコマンドでOSにボリュームを認識させる

ubuntu@ip-10-0-8-197:~$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=227328 old: size=16549855 end=16777183 new: size=167544799,end=167772127

ファイルシステムを拡張する

resize2fsファイルシステムを拡張する

ubuntu@ip-10-0-8-197:~$ sudo resize2fs /dev/xvda1
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 10
The filesystem on /dev/xvda1 is now 20943099 (4k) blocks long.

ディスクサイズが拡張されたことを確認

ubuntu@ip-10-0-8-197:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           393M  792K  393M   1% /run
/dev/xvda1       78G  1.3G   77G   2% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/xvda15     105M  5.2M  100M   5% /boot/efi
/dev/loop0       54M   54M     0 100% /snap/snapd/19122
/dev/loop1       56M   56M     0 100% /snap/core18/2751
/dev/loop2       25M   25M     0 100% /snap/amazon-ssm-agent/6563
tmpfs           393M     0  393M   0% /run/user/1000

参考

docs.aws.amazon.com

tech.innovator.jp.net

ALB+EC2+RDS+EFS構成でWordpress環境を作ったらCSSが崩れてハマった

というわけで、何度現場を移ってもWordpressから逃げられないんですよこれが。

久しぶりに1から構築するということでEFSの速度改善もしたし、使ってみるかぁという感じでやってみました。

aws.amazon.com

しかし構築したもののCSSが適用されず微妙にハマり以下のQiita記事を見て膝からがっくり落ちましたよ。。。

qiita.com

とりあえずfastcgi_paramHTTPS onを渡して対応しておしまい。 あとはRedisとS3を準備しておけばOKかな〜。

TerraformでDynamoDBのロックがおかしくなってplanできなくなった時の対応

その時は急にやってきた

terraform plan実行して問題ないことを確認して、数秒後に再実行したらこれですよ。。。

$ terraform plan
Creating terraform-aws_terraform_run ... done
Acquiring state lock. This may take a few moments...
╷
│ Error: Error acquiring the state lock
│ 
│ Error message: ConditionalCheckFailedException: The conditional request failed
│ Lock Info:
│   ID:        0bab5536-fbfb-8878-012a-1696f30d9c96
│   Path:      dev-tfstate-XXXXXXXXXXXX/dev.tfstate
│   Operation: OperationTypeApply
│   Who:       root@XXXXXXXXXXXX
│   Version:   1.0.0
│   Created:   2021-10-26 04:58:02.9271349 +0000 UTC
│   Info:      
│ 
│ 
│ Terraform acquires a state lock to protect the state from being written
│ by multiple users at the same time. Please resolve the issue above and try
│ again. For most commands, you can disable locking with the "-lock=false"
│ flag, but this is not recommended.
╵

ロックの強制解除をしてみる

はいはい、強制解除強制解除ぐらいのノリで、ツイートしたりしちゃうぐらい呑気な感じでした。

$ terraform force-unlock 0bab5536-fbfb-8878-012a-1696f30d9c96
Creating terraform-aws_terraform_run ... done
Do you really want to force-unlock?
  Terraform will remove the lock on the remote state.
  This will allow local Terraform commands to modify this state, even though it
  may be still be in use. Only 'yes' will be accepted to confirm.

  Enter a value: yes

Terraform state has been successfully unlocked!

The state has been unlocked, and Terraform commands should now be able to
obtain a new lock on the remote state.

改善せず

はい、治ったーと思ったら、以下のエラーでplanもapplyもできなくなってしまった。

╷
│ Error: Error loading state: state data in S3 does not have the expected content.
│ 
│ This may be caused by unusually long delays in S3 processing a previous state
│ update.  Please wait for a minute or two and try again. If this problem
│ persists, and neither S3 nor DynamoDB are experiencing an outage, you may need
│ to manually verify the remote state and update the Digest value stored in the
│ DynamoDB table to the following value: 755b517c310c11f04b3dfef86988ffce
│ 
│ 
│ 
╵

DynamoDBテーブルの確認

上記のエラーで出ているDigest値と異なっていることが確認できた。

  • 755b517c310c11f04b3dfef86988ffce
  • 48f5307177582df2355d9b55f7a5105b
$ aws dynamodb scan --table-name dev-tfstate-lock --profile dev
{
    "Items": [
        {
            "Digest": {
                "S": "48f5307177582df2355d9b55f7a5105b"
            },
            "LockID": {
                "S": "dev-tfstate-XXXXXXXXXXXX/dev.tfstate-md5"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

update-itemでDigestを更新

aws cliで直接DynamoDBのDigestを更新してみる

$ aws dynamodb update-item --table-name dev-tfstate-lock --key '{"LockID": {"S": "dev-tfstate-xxxxxxxxxxxx/dev.tfstate-md5"}}' --attribute-updates '{"Digest": {"Value": {"S": "755b517c310c11f04b3dfef86988ffce"},"Action": "PUT"}}' --return-values UPDATED_NEW --profile dev | jq '.Attributes.RuleSetVersion.S'

再度確認

お、ちゃんと変わってる

$ aws dynamodb scan --table-name dev-tfstate-lock --profile dev
{
    "Items": [
        {
            "Digest": {
                "S": "755b517c310c11f04b3dfef86988ffce"
            },
            "LockID": {
                "S": "dev-tfstate/dev.tfstate-md5"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1,
    "ConsumedCapacity": null
}

再度、コマンド実行してみたところ、planapplyも問題なく実行できるようになりました!

参考

pygillier.me

MySQL5.7でibtmp1が枯渇した際の対応

ibtmp1が枯渇してCPUのアラートが上がってその対応をしたのでメモ

ディスク状況の確認

/mnt/extdiskが100%になっちゃってるよ

[root@db:~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
devtmpfs                        985M     0  985M   0% /dev
tmpfs                          1000M     0 1000M   0% /dev/shm
tmpfs                          1000M  105M  895M  11% /run
tmpfs                          1000M     0 1000M   0% /sys/fs/cgroup
/dev/vda3                        16G   12G  3.7G  76% /
/dev/mapper/vg_extdisk-lv_data   99G   94G     0 100% /mnt/extdisk
tmpfs                           200M     0  200M   0% /run/user/0
tmpfs                           200M     0  200M   0% /run/user/1000

innodb_temp_data_file_pathの設定を確認

デフォルトのままっぽい

mysql> SELECT @@innodb_temp_data_file_path;
+------------------------------+
| @@innodb_temp_data_file_path |
+------------------------------+
| ibtmp1:12M:autoextend        |
+------------------------------+
1 row in set (0.00 sec)

innodb_temp_data_file_pathの設定変更を実施

とりあえず10Gを上限とするように/etc/my.cnfに記述を追記

[mysqld]
innodb_temp_data_file_path=ibtmp1:12M:autoextend:max:10G

設定が反映されたか確認

サーバー再起動しないと設定反映&ibtmp1の領域が開放されないので再起動を実施

/mnt/extdiskが5%にちゃんと減っちゃってるよ!

[root@db:~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
devtmpfs                        985M     0  985M   0% /dev
tmpfs                          1000M     0 1000M   0% /dev/shm
tmpfs                          1000M  8.7M  991M   1% /run
tmpfs                          1000M     0 1000M   0% /sys/fs/cgroup
/dev/vda3                        16G   12G  3.7G  76% /
/dev/mapper/vg_extdisk-lv_data   99G  4.3G   90G   5% /mnt/extdisk
tmpfs                           200M     0  200M   0% /run/user/0
tmpfs                           200M     0  200M   0% /run/user/1000

ibtmp1の設定も無事反映されてるよ!

mysql> SELECT @@innodb_temp_data_file_path;
+-------------------------------+
| @@innodb_temp_data_file_path  |
+-------------------------------+
| ibtmp1:12M:autoextend:max:10G |
+-------------------------------+

参考情報

docs.oracle.com

AWS DMSでDB移行をした際に移行されない属性を移行するためのSQL文

今、お仕事でとあるIaaSからAWSへのインフラ移行をしていて、DMS(Database Migration Service)を使っててめちゃ便利で最高なんですけど、これインデックスやらプライマリーキーに設定されているAUTO_INCREMENT属性やらもろもろ移行してくれないものがあります。

docs.aws.amazon.com

ただし、 AWS DMS はターゲットデータベース内にセカンダリインデックス、外部キー、ユーザーアカウントなどを自動的に作成しません。

docs.aws.amazon.com

列の AUTO_INCREMENT 属性は、ターゲットデータベース列に移行されません。

というわけでもろもろの属性を移行するためのSQLを書いたので覚書のため記載しておきます。
{SCHEMA_NAME}は対象のDBスキーマに読み替えてください。

Index移行用SQL

SELECT
  CONCAT(
    "ALTER TABLE ",
        t1.table_name,
        " ADD INDEX ",
    t1.index_name, 
    "(",
    (
      SELECT
        GROUP_CONCAT(DISTINCT t2.column_name SEPARATOR ', ')
      FROM
        information_schema.statistics AS t2
      WHERE
        t1.index_name = t2.index_name AND t1.table_name = t2.table_name
      ORDER BY
        t2.table_name,
        t2.index_name,
        t2.seq_in_index
    ),
    ");"
  ) AS alter_table_add_index_query
FROM
  information_schema.statistics AS t1
WHERE
  table_schema = "{SCHEMA_NAME}" AND index_name != "PRIMARY"
GROUP BY
  t1.table_name,
  t1.index_name
;

プライマリーキーのAUTO_INCREMENT属性移行用SQL

SELECT
 CONCAT(
   "ALTER TABLE ",
   TABLE_NAME,
   " CHANGE ",
   COLUMN_NAME,
   " ",
   COLUMN_NAME,
   " ",
   COLUMN_TYPE,
   " AUTO_INCREMENT;"
 ) as alter_auto_increment
FROM
 information_schema.columns
WHERE
 table_schema = "{SCHEMA_NAME}"
and is_nullable = "NO"
and column_key = "PRI"
and extra = "auto_increment"
;

おわりに

あとはそれぞれ生成したALTER文を移行先のDBで流せばOKです! 動作責任は負いかねますが、どなたかの助けになれば嬉しいです!

おまけ

外部キーを貼っているテーブルに関する調査もしたのでその際に確認したコマンドも記載しておきます。

外部キーを貼っているテーブルの調査

select * from information_schema.table_constraints where table_schema = "{SCHEMA_NAME}" and constraint_type = "FOREIGN KEY";

特定のテーブルへの外部キーを貼っているテーブルの調査

select distinct(referenced_table_name) from information_schema.key_column_usage where constraint_schema = "{SCHEMA_NAME}";

bashの変数展開で最後の文字を取り出す方法

Bashの変数展開で最後の文字だけ取得する際の仕様がちょっと分かりづらかったのでメモ

やりたいこと

以下のような変数と値があった場合に最後の文字であるdだけを変数展開で取り出したい!

text="Hello World"

やりかた

以下のように変数展開の:のうしろにスペースをいれてやる必要があった

echo ${text: -1}
d

スペースなしだと以下のようになる

echo ${text:-1}
Hello World

参考

genzouw.com