tag:blogger.com,1999:blog-2862545593738043882024-03-05T17:18:44.652+09:00BLUE21neoここは、インフラエンジニアの個人的な備忘録です。Unknownnoreply@blogger.comBlogger217125tag:blogger.com,1999:blog-286254559373804388.post-1983499210891409512023-05-08T11:07:00.001+09:002023-05-08T11:24:04.077+09:00ubuntu22 のasdf install python でエラーになる<p> </p><p>WSL2(ubuntu22.04)で asdf install python をすると下記のエラーになりました。</p><pre class="term">$ asdf install python 3.9.16
python-build 3.9.16 /home/blue21/.asdf/installs/python/3.9.16
Downloading Python-3.9.16.tar.xz...
-> https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tar.xz
Installing Python-3.9.16...
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/blue21/.asdf/installs/python/3.9.16/lib/python3.9/ssl.py", line 99, in <module>
import _ssl # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems
BUILD FAILED (Ubuntu 22.04 using python-build 2.3.17-9-g528d10e9)
Inspect or clean up the working tree at /tmp/python-build.20230508095140.208920
Results logged to /tmp/python-build.20230508095140.208920.log
Last 10 log lines:
LD_LIBRARY_PATH=/tmp/python-build.20230508095140.208920/Python-3.9.16 ./python -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Looking in links: /tmp/tmpecek77jj
Processing /tmp/tmpecek77jj/setuptools-58.1.0-py3-none-any.whl
Processing /tmp/tmpecek77jj/pip-22.0.4-py3-none-any.whl
Installing collected packages: setuptools, pip
WARNING: The scripts pip3 and pip3.9 are installed in '/home/blue21/.asdf/installs/python/3.9.16/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-22.0.4 setuptools-58.1.0</pre><p><br /></p><p>下記URLを参考に依存パッケージはインストール済です。</p><p></p><ul style="text-align: left;"><li><a href="https://github.com/pyenv/pyenv/wiki#suggested-build-environment">https://github.com/pyenv/pyenv/wiki#suggested-build-environment</a></li></ul><p></p><p>brew を使ってる影響だろうか?</p><p>ネットで調べて、いろいろ試しましたが、下記のようにしたらinstallに成功しました。</p><pre class="term">$ PYTHON_CONFIGURE_OPTS="--with-openssl=/usr --with-openssl-rpath=/usr/lib64 --enable-optimizations" asdf install python 3.9.16
python-build 3.9.16 /home/blue21/.asdf/installs/python/3.9.16
Downloading Python-3.9.16.tar.xz...
-> https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tar.xz
Installing Python-3.9.16...
Installed Python-3.9.16 to /home/blue21/.asdf/installs/python/3.9.16</pre><p>list で見ると以下のとおり。</p><pre class="term">$ asdf list python
*3.11.3
3.9.16</pre><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-13355159480140238022023-04-21T21:02:00.004+09:002023-05-09T18:02:34.451+09:00ssh鍵を別マシンで使ったらgit cloneでrepository not found になった<p> </p><p>いつもはLinuxマシン(debian)で開発している。</p><p>Linuxマシン(debian)で使用していたSSH鍵を使いまわそうとして、WindowsマシンのWSL2(ubuntu)にコピーしてgit clone したら、下記のエラーになった。</p><pre class="term">$ git clone git@github.com:user/demo.git
Cloning into 'demo'...
Warning: Permanently added 'github.com,20.27.177.113' (ECDSA) to the list of known hosts.
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.</pre><p><br /></p><p>Linuxマシン(debian)のSSH鍵を使いまわすことは、できないみたい。</p><p>WindowsのWSL2(ubuntu)でSSH鍵を作ってGithubに登録したら、git cloneできました。</p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-28284958103626868452023-03-25T10:44:00.007+09:002023-03-25T10:44:00.347+09:00EKSのkubeconfigを作らずに、kubectlとhelm コマンドを動かす<p> </p><p>こんなかんじでEKSから情報を取ります。</p><pre class="term">EKS_CLUSTER_NAME=main-cluster
EKS_TOKEN=$(aws eks get-token \
--cluster-name ${EKS_CLUSTER_NAME} \
| jq -r '.status.token')
EKS_ENDPOINT=$(aws eks describe-cluster \
--name ${EKS_CLUSTER_NAME} \
--query 'cluster.endpoint' \
--output text)
aws eks describe-cluster \
--name ${EKS_CLUSTER_NAME} \
--query 'cluster.certificateAuthority.data' \
--output text \
| base64 -d > /tmp/ca.crt</pre><p><br /></p><p>上記の情報を kubectl に渡して実行します。</p><pre class="term">s kubectl get pods -A \
--server="${EKS_ENDPOINT}" \
--certificate_authority=/tmp/ca.crt \
--token="${EKS_TOKEN}"</pre><p><br /></p><p>helm は、こんなかんじ</p><pre class="term">helm repo add eks https://aws.github.io/eks-charts \
--kube-apiserver "${EKS_ENDPOINT}" \
--kube-token "${EKS_TOKEN}" \
--kube-ca-file "/tmp/ca.crt"</pre><p><br /></p><p>EKSを構築したヒト以外は、下記URLの作業が必要かもしれない。</p><p><a href="https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html">https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/add-user-role.html</a></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-17038960044783292622023-03-18T12:20:00.003+09:002023-03-18T12:20:00.208+09:00awscliのSSM(AWS-RunShellScript)でコマンドにシングルクォーテーションを使うとエラーになる<p> </p><p>こんな感じで、シングルクォーテーションを含んだコマンドを実行するとエラーになります。</p><pre class="term">$ CMD="sudo su - ec2-user -c 'ls -l /'"
$ aws ssm send-command \
--document-name "AWS-RunShellScript" \
--comment "test" \
--instance-ids i-0f70020feb5f861ce \
--parameters commands="$CMD"
Error parsing parameter '--parameters': Expected: ',', received: ''' for input:
commands=sudo su - ec2-user -c 'ls -l /'</pre><br /><p>これを、下記のように --parameters の引数をjson形式にすると実行できました。</p><pre class="term">$ aws ssm send-command \
--document-name "AWS-RunShellScript" \
--comment "test" \
--instance-ids i-0f70020feb5f861ce \
--parameters "{\"commands\":[\"$CMD\"]}"</pre>
<p> </p><p> </p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-2188482078329905892023-03-11T10:49:00.008+09:002023-03-11T10:49:00.202+09:00私のtmux (2023年バージョン)<p> </p><p>私の環境</p><p>- SparkyLinux6.6</p><p>- bash5.1.4</p><p>- tmux3.3a</p><p>- Terminal: xfce terminal</p><p>- Terminal font: DroidSansMono Nerd Font 10</p><p><br /></p><p>私のtmuxの見た目です。</p><p>左右に画面を分割し、右側を上下に分割しています。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUwKdnRMeUr_dVDGTyi9r6q7U2GBHv5ZQRXj7OXRd5AMAuJfrOZ4OoJknJ6HZxbzf5v305QwMOZ73bA1Y-tUwxGb6kcUF3MWm4jEa-oGeqx7JAEuoVJCYmYKrxE_puAWW4mO3QrW_U218n3g7p190rze77bQow1bSCYa4KpOJM8ArZ4uwNBJWL1Q0Cbw/s994/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="633" data-original-width="994" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUwKdnRMeUr_dVDGTyi9r6q7U2GBHv5ZQRXj7OXRd5AMAuJfrOZ4OoJknJ6HZxbzf5v305QwMOZ73bA1Y-tUwxGb6kcUF3MWm4jEa-oGeqx7JAEuoVJCYmYKrxE_puAWW4mO3QrW_U218n3g7p190rze77bQow1bSCYa4KpOJM8ArZ4uwNBJWL1Q0Cbw/s320/001.png" width="320" /></a></div><p><br /></p><p>ターミナルは、xfce terminal を使用しています。</p><p>私が試した他のターミナルは、画面分割したときに罫線が崩れてしまったのですが、xfce terminal は問題ありませんでした。</p><p>ターミナルフォントは、DroidSansMono Nerd Font 10を使用しています。</p><p>下記から入手しました。</p><p></p><ul style="text-align: left;"><li><a href="https://github.com/ryanoasis/nerd-fonts">https://github.com/ryanoasis/nerd-fonts</a></li></ul><p></p><p>xfce terminal のフォント設定以下のとおり。</p><p>ターミナル右クリックでメニューを表示し、「設定」を選択すると設定画面が開きます。</p><div style="text-align: left;"><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgadqBPssxpdo8cq5KjxOcRnfDeAsqrt5PtdX26vRFaxXVj9bcPgt5uEMSHqbkBCzp62E326U8wAnTVMMVJ5VZXR07jeHK3N0OvozS3EG659NM57KOUPTmBG4c8cgaVZx4LxDljLvHFwLr98uRBcTkt2qxIIjv2OT0QneT_oWwSr4l46SmITGWNrDnQ/s595/002.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="595" data-original-width="585" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAgadqBPssxpdo8cq5KjxOcRnfDeAsqrt5PtdX26vRFaxXVj9bcPgt5uEMSHqbkBCzp62E326U8wAnTVMMVJ5VZXR07jeHK3N0OvozS3EG659NM57KOUPTmBG4c8cgaVZx4LxDljLvHFwLr98uRBcTkt2qxIIjv2OT0QneT_oWwSr4l46SmITGWNrDnQ/s320/002.png" width="315" /></a></div></div><p><br /></p><p>tmuxの設定(tmux.conf)は以下のとおり。</p><pre class="prettyprint linenums">###############################################################
# シェルの設定
###############################################################
# tmux 起動時のシェルを /bin/zsh にする
#set -g default-shell /bin/zsh
# /usr/local/bin/zsh を使っている場合
# set -g default-shell /usr/local/bin/zsh
###############################################################
# prefix キーバインド変更 ※デフォルトは C-b
###############################################################
# prefix を C-z に変更する
#set -g prefix C-z
#bind-key C-z send-prefix
#unbind-key C-b
# prefix C-b を解除
#unbind C-b
###############################################################
# Emacs 風キーバインド
###############################################################
# setw -g mode-keys vi
setw -g mode-keys emacs
# prefix C-z でコピーモードに入る
bind-key C-z copy-mode
# prefix C-y でペーストする
bind-key C-y paste-buffer
# PageUp => 1ページ遡ってコピーモードに入る: ログを見る時など便利
bind -n Pageup copy-mode -u
unbind 1
unbind ^C
unbind &
# prefix 0 現在のペインを削除
bind 0 kill-pane
# prefix 1 ウインドウ内の現在のペインを残し、他のペインをウインドウにする
bind 1 break-pane
# prefix 2 ウインドウを横に分割
bind 2 split-window -v
# prefix 3 ウインドウを縦に分割
bind 3 split-window -h
# prefix o ペインをローテート
bind o select-pane -t :.+
# prefix k ウインドウを削除
bind k kill-window
# prefix C-k ペインを削除
bind C-k kill-pane
# prefix i
bind i display-panes
# prefix C-t
bind C-t next-window
# prefix c
bind c new-window
###############################################################
# vim 風キーバインド
###############################################################
# vim のキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# vim のキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
###### Vim コピーモード ######
# 'v' で選択を始める
# bind -T copy-mode-vi v send -X begin-selection
# 'V' で行選択
# bind -T copy-mode-vi V send -X select-line
# 'C-v' で矩形選択
# bind -T copy-mode-vi C-v send -X rectangle-toggle
# 'y' でヤンク
# bind -T copy-mode-vi y send -X copy-selection
# 'Y' で行ヤンク
# bind -T copy-mode-vi Y send -X copy-line
###############################################################
# キーバインド
###############################################################
# 番号基準値を変更
set -g base-index 1
# マウス操作を有効にする
set -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
# マウスアップ時に選択完了せず、選択状態を維持し、Ctrl-cでクリップボードにコピーする
unbind -T copy-mode MouseDragEnd1Pane
unbind -T copy-mode-vi MouseDragEnd1Pane
bind-key -T copy-mode C-c send-keys -X copy-pipe-and-cancel "xsel -bi"
bind-key -T copy-mode-vi C-c send-keys -X copy-pipe-and-cancel "xsel -bi"
###############################################################
# 色・見た目
###############################################################
# ステータスバーを 1 秒毎に描画し直す
set -g status-interval 1
# センタライズ (主にウインドウ番号など)
set -g status-justify centre
# ステータスバーをトップに配置する
set -g status-position top
# 左右のステータスバーの長さを決定する
set -g status-left-length 90
set -g status-right-length 90
# ステータスバー(左側)
#set -g status-left '#H:[#P]'
#set -g status-left 'Session:#S W:#I P:#P'
set-option -g status-left "\
#[bg=colour148]#[fg=colour234] Session:#S W:#I P:#P \
#[bg=colour054]#[fg=colour255] #h \
#[bg=colour024] #(~/workspace/toolbin/ip.sh)\
#[fg=colour024]#[bg=colour234]"
# ステータスバー(中央)
setw -g window-status-current-format '\
#[fg=colour239]#[bg=colour234]#[bg=colour239]#[fg=colour119]\
#I#[fg=colour249]:#[fg=colour255]#W#[fg=colour249]\
#F#[fg=colour239]#[bg=colour234]'
# ステータスバー(右側)
#set -g status-right '[%y-%m-%d(%a) %H:%M]'
set-option -g status-right "\
#[fg=colour237]#[fg=colour254]#[bg=colour237]\
#[bg=colour237] #(~/workspace/toolbin/uname.sh)\
#[fg=colour240]#[fg=colour255]#[bg=colour240]\
%Y-%m-%d(%a) %H:%M "
# ステータスバーの色を設定する
set -g status-bg "colour234"
set -g status-fg "colour255"
# pane border
set -g pane-border-style fg="colour236"
set -g pane-active-border-style fg="colour106"
#setw -g window-status-activity-style bg="colour16","underscore",fg="colour45"
# pane status bottom
set-option -g pane-border-status bottom
# tmuxを 24bit color 表示できるようにする
set -g default-terminal xterm-256color
set -ga terminal-overrides ',xterm-256color:Tc'
###############################################################
# iTerm2 設定
###############################################################
# tmux ウインドウタイトルを iTerm2 タブ/ウインドウのタイトルに表示する
#set-option -g set-titles on
#set-option -g set-titles-string '#T'
###############################################################
# Plugin for windows
###############################################################
# https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x86.zip
#bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "win32yank.exe -i"
#bind p run-shell 'win32yank.exe -o | xargs -0 -I{} tmux set-buffer -- {} && tmux paste-buffer'</pre><p>emacsライクなキーバインドにしています。</p><p>- CTL-b,2 で上下2列に分割</p><p>- CTL-b,3 で左右2列に分割</p><p><br /></p><p>コピー&ペーストは、デフォルト設定だとブラウザにペーストできなかったので変更しています。</p><p>- マウスで選択後、CTL-cでコピーします。</p><p>- CTL-SHIFT,vでペーストします。</p><p><br /></p><p>~/workspace/toolbin/ip.sh で画面左上に自分のIPアドレスを表示します。</p><pre class="term">#!/bin/bash
ip=$(ip a | grep inet | grep wlan0 | awk '{print $2}')
echo "$(echo -e '\uf817') ${ip}"
</pre><div><br /></div><p>~/workspace/toolbin/uname.sh で画面右上に自分のOSを表示します。</p><pre class="term">#!/bin/bash
os=$(cat /etc/os-release | tr -d '"' | awk -F'=' '($0~/^NAME/){printf("%s ",$2)}')
echo "$(echo -e '\uf83c') ${os}"
</pre><div><br /></div><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-12784681980282384312023-03-04T22:21:00.027+09:002023-03-07T08:52:58.482+09:00私のemacs (2023年バージョン)<p>私の環境</p><p>- SparkyLinux6.6</p><p>- Emacs 28.2</p><p><br /></p><p>私のemacsの設定(init.el)は以下のとおり。</p><p><br /></p><pre class="prettyprint linenums">;;; 起動高速化(GC減らす)
;;; https://emacs-jp.github.io/tips/startup-optimization
(setq gc-cons-threshold most-positive-fixnum)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; パッケージ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'package)
(setq package-archives
'(("melpa" . "https://melpa.org/packages/")
("melpa-stable" . "https://stable.melpa.org/packages/")
("org" . "http://orgmode.org/elpa/")
("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize)
;; パッケージ情報の更新
;(package-refresh-contents)
;; インストールするパッケージ
(defvar my/favorite-packages
'(
magit magit-delta
yaml-mode highlight-indentation highlight-indent-guides
phps-mode tide terraform-mode json-mode jq-format
markdown-mode w3m
python-mode pipenv jedi
cfn-mode dockerfile-mode docker-compose-mode
company ivy yasnippet yasnippet-snippets
counsel swiper ivy-rich avy-migemo symbol-overlay
flycheck
rainbow-mode rainbow-delimiters
;;powerline
smart-mode-line total-lines smart-mode-line-powerline-theme
neotree dired-k
which-key docker-tramp s3ed
;;ob-ipython
))
;; my/favorite-packagesからインストールしていないパッケージをインストール
(dolist (package my/favorite-packages)
(unless (package-installed-p package)
(package-install package)))
;; install packages
;; brew install w3m markdown
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; load-path
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq load-path
(append
(list
(expand-file-name "~/.emacs.d/user")
)
load-path))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 日本語
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(set-language-environment 'Japanese) ; 日本語環境
(set-default-coding-systems 'utf-8-unix) ; UTF-8 が基本
(set-buffer-file-coding-system 'utf-8-unix) ; UTF-8 が基本
(set-terminal-coding-system 'utf-8-unix) ; emacs -nw も文字化けしない
(setq default-file-name-coding-system 'utf-8)
(setq default-process-coding-system '(utf-8 . utf-8))
(prefer-coding-system 'utf-8-unix)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; org mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;color
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(org-block ((t (:froground "#cccccc" :background "#191970" :extend t))))
'(org-block-begin-line ((t (:underline "#008EFF" :foreground "#008EFF" :extend t))))
'(org-block-end-line ((t (:overline "#008EFF" :foreground "#008EFF" :extend t))))
'(org-code ((t (:foreground "#CCCCCC"))))
'(org-document-info ((t (:foreground "#229922" :extend t))))
'(org-document-title ((t (:foreground "#00cc00" :extend t :bold t))))
'(org-level-1 ((t (:background "#007799" :foreground "#ffffff" :extend t :bold t))))
'(org-table ((t (:foreground "#CCCCCC")))))
;;
(require 'org-tempo) ; <s TAB
(setq org-return-follows-link t) ; リンクはRETで開く
(setq org-startup-truncated nil) ; org-mode開始時は折り返しするよう設定
(setq org-startup-with-inline-images t) ; 画像をインライン表示
(setq org-edit-src-content-indentation 0) ; BEGIN_SRCブロック内をインデントをしない
(setq org-startup-folded 'content) ; 見出しのみみせる
;; speed command
;; https://qiita.com/takaxp/items/a5a3383d7358c58240d0
(setq org-use-speed-commands t)
;;code
;;;; exec-path-from-shell
(when (memq window-system '(mac ns x))
(exec-path-from-shell-initialize))
;;;; org-babel
;; コード実行時に confirm しない
(setq org-confirm-babel-evaluate nil)
;; 実行できる言語を指定
(setq org-babel-python-command "python3")
(org-babel-do-load-languages
'org-babel-load-languages
'(
(shell . t)
(python . t)
;;(ipython . t)
)
)
;; アジェンダ表示の対象ファイル
(setq org-agenda-files '(
"~/workspace/OrgNote/notes.org"
"~/workspace/OrgNote/todo.org"
))
;; C-ca で org-agenda
(define-key global-map "\C-ca" 'org-agenda)
;; アジェンダ表示で下線を用いる
(add-hook 'org-agenda-mode-hook '(lambda () (hl-line-mode 1)))
(setq hl-line-face 'underline)
;; todo
(setq org-log-done 'time)
(setq org-todo-keywords
'((sequence "TODO(t)" "SOMEDAY(s)" "WAITING(w)" "|" "DONE(d)" "CANCELED(c@)")))
;; memo
;;
;; https://www.mhatta.org/wp/2018/08/16/org-mode-101-1/
;; ファイルの場所
(setq org-directory "~/workspace/OrgNote")
(setq org-default-notes-file "notes.org")
;; メモをC-M-^一発で見るための設定
;; https://qiita.com/takaxp/items/0b717ad1d0488b74429d から拝借
(defun show-org-buffer (file)
"Show an org-file FILE on the current buffer."
(interactive)
(if (get-buffer file)
(let ((buffer (get-buffer file)))
(switch-to-buffer buffer)
(message "%s" file))
(find-file (concat "~/workspace/OrgNote/" file))))
(global-set-key (kbd "C-M-^") '(lambda () (interactive)
(show-org-buffer "notes.org")))
;; Org-captureを呼び出すキーシーケンス
(define-key global-map "\C-cc" 'org-capture)
;; Org-captureのテンプレート(メニュー)の設定
(setq org-capture-templates
'(("n" "Note" entry (file+headline "~/workspace/OrgNote/notes.org" "Notes")
"* %?\nEntered on %U\n %i\n %a")
("t" "Todo" entry (file+headline "~/workspace/OrgNote/todo.org" "Todo")
"* TODO %?\n %i\n %a")
))
;; export Markdown
(eval-after-load "org" '(require 'ox-md nil t))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; docker
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; C-x C-f /docker:user@container:/path/to/file
(autoload 'docker-tramp-compat "docker-tramp-compat")
(with-eval-after-load 'docker-tramp-compat
(set-variable 'docker-tramp-use-names t)
)
;; docker
(autoload 'dockerfile-mode "dockerfile-mode")
(add-to-list 'auto-mode-alist '("Dockerfile\\'" . dockerfile-mode))
(autoload 'docker-compose-mode "docker-compose-mode")
(add-to-list 'auto-mode-alist '("docker-compose.yml\\'" . docker-compose-mode))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; S3
;; https://dev.classmethod.jp/articles/s3ed-an-interface-to-s3-from-emacs/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 's3ed "s3ed")
(global-set-key (kbd "C-c s f") 's3ed-find-file)
(global-set-key (kbd "C-c s s") 's3ed-save-file)
(global-set-key (kbd "C-c s p") 's3ed-set-profile)
(with-eval-after-load 's3ed
(s3ed-mode)
(setq s3ed-profile-name "sandbox")
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; GIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; magit
(require 'magit)
(eval-after-load 'magit
'(progn
(set-face-background 'magit-section-highlight "#303030")))
(global-set-key (kbd "M-g") 'magit-status)
;; git-delta
;; brew install git-delta
(add-hook 'magit-mode-hook (lambda () (magit-delta-mode +1)))
;; Show Git branch information to mode-line
(let ((cell (or (memq 'mode-line-position mode-line-format)
(memq 'mode-line-buffer-identification mode-line-format)))
(newcdr '(:eval (my/update-git-branch-mode-line))))
(unless (member newcdr mode-line-format)
(setcdr cell (cons newcdr (cdr cell)))))
(defun my/update-git-branch-mode-line ()
(let* ((branch (replace-regexp-in-string
"[\r\n]+\\'" ""
(shell-command-to-string "git symbolic-ref -q HEAD")))
(mode-line-str (if (string-match "^refs/heads/" branch)
(format " [%s] " (substring branch 11))
" [Not Repo] ")))
(propertize mode-line-str
'face '((:background "#550000" :foreground "#ffffff" :weight bold)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Markdown書式&プレビュー
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; markdown preview
(autoload 'markdown-mode "markdown-mode")
(autoload 'w3m "w3m")
(with-eval-after-load 'markdown-mode
(define-key markdown-mode-map (kbd "\C-c \C-c \C-v")
(lambda ()
(interactive)
(setq html-file-name (concat (file-name-sans-extension (buffer-file-name)) ".html"))
(markdown-export html-file-name)
(if (one-window-p) (split-window-right))
(other-window 1)
(w3m-find-file html-file-name)
(w3m-reload-this-page)
(other-window 1)))
)
;; markdown
(autoload 'markdown-mode "markdown-mode"
"Major mode for editing Markdown files" t)
(add-to-list 'auto-mode-alist '("\\.markdown\\'" . markdown-mode))
(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
(autoload 'gfm-mode "markdown-mode"
"Major mode for editing GitHub Flavored Markdown files" t)
(add-to-list 'auto-mode-alist '("README\\.md\\'" . gfm-mode))
;; markdown(github style)
;; [note] gem install commonmarker
(setq markdown-command "commonmarker --extension=autolink,strikethrough,table,tagfilter,tasklist"
markdown-css-paths '("https://cdn.jsdelivr.net/npm/github-markdown-css"
"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/styles/github.min.css")
markdown-xhtml-header-content "
<style>
body {
padding: 1rem 3rem;
}
@media only screen {
body {
border: 1px solid #ddd;
margin: 1rem auto;
max-width: 45rem;
padding: 3rem;
}
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6,
.markdown-body h6,
.markdown-body strong {
font-weight: 700;
}
</style>
<script src=\"https://cdn.jsdelivr.net/gh/highlightjs/cdn-release/build/highlight.min.js\"></script>
<script>hljs.initHighlightingOnLoad();</script>"
markdown-xhtml-body-preamble "<div class=\"markdown-body\">"
markdown-xhtml-body-epilogue "</div>")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ソースコードの見た目
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;python
(autoload 'python-mode "python-mode")
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(autoload 'pipenv "pipenv")
(add-hook 'python-mode-hook 'pipenv-mode)
(autoload 'jedi "jedi")
(add-hook 'python-mode-hook 'jedi:setup)
(with-eval-after-load 'jedi
(setq jedi:complete-on-dot t)
)
;; cfn
(autoload 'cfn-mode "cfn-mode")
;(add-to-list 'auto-mode-alist '("cfn" . cfn-mode))
;; yaml
(autoload 'yaml-mode "yaml-mode")
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
(add-to-list 'auto-mode-alist '("\\.yaml\\'" . yaml-mode))
;; indent
(require 'highlight-indentation)
(setq highlight-indentation-offset 2)
;(set-face-background 'highlight-indentation-face "#e3e3d3")
;(set-face-background 'highlight-indentation-current-column-face "#c3b3b3")
(set-face-background 'highlight-indentation-face "#003355")
(set-face-background 'highlight-indentation-current-column-face "#cccccc")
(add-hook 'yaml-mode-hook 'highlight-indentation-mode)
(add-hook 'yaml-mode-hook 'highlight-indentation-current-column-mode)
(add-hook 'yaml-mode-hook '(lambda() (setq highlight-indentation-offset 2)))
(add-hook 'python-mode-hook 'highlight-indentation-mode)
(add-hook 'python-mode-hook 'highlight-indentation-current-column-mode)
(add-hook 'python-mode-hook '(lambda() (setq highlight-indentation-offset 2)))
;; php
(autoload 'phps-mode "phps-mode")
(add-to-list 'auto-mode-alist '("\\.php\\'" . phps-mode))
;; typescript
(autoload 'tide "tide")
(add-hook 'typescript-mode-hook
(lambda ()
(interactive)
(tide-setup)
(flycheck-mode +1)
(setq flycheck-check-syntax-automatically '(save mode-enabled))
(eldoc-mode +1)
(tide-hl-identifier-mode +1)
(company-mode +1)
(global-set-key (kbd "M-*") 'tide-jump-back)))
;; bash
;(autoload 'sh-mode "sh-mode")
(add-to-list 'auto-mode-alist '("\\.bash_aliases\\'" . sh-mode))
;; terraform
(require 'terraform-mode)
(add-hook 'terraform-mode-hook #'terraform-format-on-save-mode)
;; json
(require 'json-mode)
(add-to-list 'auto-mode-alist '("\\.json$" . json-mode))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 構文チェック(flycheck)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'flycheck)
(global-flycheck-mode)
(setq flycheck-emacs-lisp-load-path 'inherit )
(define-key global-map (kbd "\C-cn") 'flycheck-next-error)
(define-key global-map (kbd "\C-cp") 'flycheck-previous-error)
(define-key global-map (kbd "\C-cd") 'flycheck-list-errors)
(require 'flycheck-flash-mode-line)
(flycheck-flash-mode-line t)
;; cfn-lint
(flycheck-define-checker cfn-lint
"AWS CloudFormation linter using cfn-lint.
Install cfn-lint first: pip install cfn-lint
See `https://github.com/aws-cloudformation/cfn-python-lint'."
:command ("cfn-lint" "-f" "parseable" source)
:error-patterns ((warning line-start (file-name) ":" line ":" column
":" (one-or-more digit) ":" (one-or-more digit) ":"
(id "W" (one-or-more digit)) ":" (message) line-end)
(error line-start (file-name) ":" line ":" column
":" (one-or-more digit) ":" (one-or-more digit) ":"
(id "E" (one-or-more digit)) ":" (message) line-end))
:modes (cfn-mode))
(add-to-list 'flycheck-checkers 'cfn-lint)
(add-hook 'cfn-mode-hook 'flycheck-mode)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; スニペット
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'yasnippet)
(setq yas-snippet-dirs
'("~/.emacs.d/mySnippets"
"~/.emacs.d/elpa/yasnippet-snippets-20220713.1234/snippets"
))
;; yas起動
(yas-global-mode 1)
;; 既存スニペットを挿入する
(define-key yas-minor-mode-map (kbd "C-x i i") 'yas-insert-snippet)
;; 新規スニペットを作成するバッファを用意する
(define-key yas-minor-mode-map (kbd "C-x i n") 'yas-new-snippet)
;; 既存スニペットを閲覧・編集する
(define-key yas-minor-mode-map (kbd "C-x i v") 'yas-visit-snippet-file)
; こいつをdataに入れれば、indentが反映される。
; # expand-env: ((yas-indent-line 'fixed) (yas-wrap-around-region 'nil))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 補完
;; https://qiita.com/blue0513/items/c0dc35a880170997c3f5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ivy設定
(require 'ivy)
(ivy-mode 1)
(setq ivy-use-virtual-buffers t) ;; `ivy-switch-buffer' (C-x b) のリストに recent files と bookmark を含める.
(setq enable-recursive-minibuffers t) ;; ミニバッファでコマンド発行を認める
(setq ivy-height 20) ;; minibufferのサイズを拡大!(重要)
;(setq ivy-extra-directories nil)
(setq ivy-re-builders-alist
'((t . ivy--regex-plus)))
;; ivy-rich
(require 'ivy-rich)
(ivy-rich-mode 1)
;; counsel設定
(global-set-key (kbd "C-c g") 'counsel-git)
(global-set-key (kbd "C-c j") 'counsel-git-grep)
(global-set-key (kbd "M-x") 'counsel-M-x)
(global-set-key (kbd "C-x C-f") 'counsel-find-file) ;; find-fileもcounsel任せ!
(setq counsel-find-file-ignore-regexp (regexp-opt '("./" "../")))
;; search
(global-set-key "\C-s" 'swiper)
(setq swiper-include-line-number-in-search t) ;; line-numberでも検索可能
;; migemo + swiper(日本語をローマ字検索できるようになる)
;(require 'avy-migemo)
;(avy-migemo-mode 1)
;(require 'avy-migemo-e.g.swiper)
;; company
(require 'company)
(global-company-mode) ; 全バッファで有効にする
(setq company-transformers '(company-sort-by-backend-importance)) ;; ソート順
(setq company-idle-delay 0) ; デフォルトは0.5
(setq company-minimum-prefix-length 3) ; デフォルトは4
(setq company-selection-wrap-around t) ; 候補の一番下でさらに下に行こうとすると一番上に戻る
(setq completion-ignore-case t)
(setq company-dabbrev-downcase nil)
(global-set-key (kbd "C-M-i") 'company-complete)
(define-key company-active-map (kbd "C-n") 'company-select-next) ;; C-n, C-pで補完候補を次/前の候補を選択
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-search-map (kbd "C-n") 'company-select-next)
(define-key company-search-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "C-s") 'company-filter-candidates) ;; C-sで絞り込む
(define-key company-active-map (kbd "C-i") 'company-complete-selection) ;; TABで候補を設定
(define-key company-active-map [tab] 'company-complete-selection) ;; TABで候補を設定
(define-key company-active-map (kbd "C-f") 'company-complete-selection) ;; C-fで候補を設定
(define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete) ;; 各種メジャーモードでも C-M-iで company-modeの補完を使う
;; yasnippetとの連携
(defvar company-mode/enable-yas t
"Enable yasnippet for all backends.")
(defun company-mode/backend-with-yas (backend)
(if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
backend
(append (if (consp backend) backend (list backend))
'(:with company-yasnippet))))
(setq company-backends (mapcar #'company-mode/backend-with-yas company-backends))
;; symbol-over
(require 'symbol-overlay)
(add-hook 'prog-mode-hook #'symbol-overlay-mode)
(add-hook 'markdown-mode-hook #'symbol-overlay-mode)
(global-set-key (kbd "M-i") 'symbol-overlay-put)
(define-key symbol-overlay-map (kbd "p") 'symbol-overlay-jump-prev) ;; 次のシンボルへ
(define-key symbol-overlay-map (kbd "n") 'symbol-overlay-jump-next) ;; 前のシンボルへ
(define-key symbol-overlay-map (kbd "C-g") 'symbol-overlay-remove-all) ;; ハイライトキャンセル
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ディレクトリ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(autoload 'neotree "neotree")
(with-eval-after-load 'neotree
(setq neo-theme (if (display-graphic-p) 'icons 'arrow)) ;ascii, icon, classic等もあるよ!
(setq neo-persist-show t) ;; delete-other-window で neotree ウィンドウを消さない
(setq neo-smart-open t) ;; neotree ウィンドウを表示する毎に current file のあるディレクトリを表示する
(setq neo-smart-open t)
(custom-set-faces
'(neo-root-dir-face ((t (:foreground "#8D8D84"))))
'(neo-dir-link-face ((t (:foreground "#0000FF"))))
'(neo-file-link-face ((t (:foreground "#BA36A5")))))
)
(global-set-key "\C-o" 'neotree-toggle)
(require 'dired-k)
(setq dired-k-style 'git)
(define-key dired-mode-map (kbd "g") 'dired-k)
(add-hook 'dired-initial-position-hook 'dired-k)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; キーマップ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; キーバインドのヘルプ
(require 'which-key)
(which-key-mode)
(which-key-setup-side-window-right)
;;(setq which-key-show-early-on-C-h t)
;; Deleteキーでカーソル位置の文字が消えるようにする
(global-set-key [delete] 'delete-char)
;; C-h は Backspace でないと押し間違えてしまうらしい
(define-key global-map "\C-h" 'backward-delete-char)
;; 行番号指定ジャンプ
(define-key global-map "\C-x\C-\j" 'goto-line)
;; C-t でスクロールダウン
(define-key global-map "\C-t" 'scroll-down)
;; コンパイル
(define-key global-map "\C-xc" 'compile)
;; 改行・タブ・スペースを色づけする
(define-key global-map (kbd "C-^") 'global-whitespace-mode)
;; C-\の日本語入力の設定を無効にする
(define-key global-map (kbd "C-\\") nil)
;; 再表示
(defun revert-buffer-no-confirm (&optional force-reverting)
"Interactive call to revert-buffer. Ignoring the auto-save
file and not requesting for confirmation. When the current buffer
is modified, the command refuses to revert it, unless you specify
the optional argument: force-reverting to true."
(interactive "P")
;;(message "force-reverting value is %s" force-reverting)
(if (or force-reverting (not (buffer-modified-p)))
(revert-buffer :ignore-auto :noconfirm)
(error "The buffer has been modified")))
(global-set-key "\M-r" 'revert-buffer-no-confirm)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 見栄え(テーマ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(load-theme 'tango-dark t)
;;(load-theme 'alect-black-alt t)
;;(load-theme 'solarized-dark t)
;;(load-theme 'atom-one-dark t)
;;(load-theme 'badger t)
(custom-theme-set-faces
'tango-dark
'(default ((t (:background nil))))
;'(mouse ((t (:foreground "black"))))
;'(cursor ((t (:background "yellow"))))
;'(border ((t (:foreground "black"))))
;'(bold ((t (:bold t :background "blue3" :foreground "white"))))
;'(bold-italic ((t (:italic t :bold t :foreground "blue3"))))
;'(calendar-today-face ((t (:underline t))))
;'(diary-face ((t (:foreground "red"))))
;'(font-lock-builtin-face ((t (:foreground "LightSteelBlue"))))
'(font-lock-comment-face ((t (:foreground "#008787"))))
)
(provide-theme 'tango-dark)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 見栄え(modeline)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; smart-mode-line
(setq sml/no-confirm-load-theme t)
;(setq sml/theme 'dark)
(setq sml/theme 'light-powerline)
(setq sml/shorten-directory -1) ;; directory pathはフルで表示されたいので
(sml/setup)
;; total lines with smartline
(require 'total-lines)
(global-total-lines-mode t)
(defun my-set-line-numbers ()
(setq-default mode-line-front-space
(append mode-line-front-space
'((:eval (format " (%d)" (- total-lines 1))))))) ;; 「" (%d)"」の部分はお好みで
(add-hook 'after-init-hook 'my-set-line-numbers)
;; powerline
;(require 'powerline)
;(powerline-default-theme)
;(powerline-center-theme)
;(set-face-attribute 'mode-line nil
; :foreground "#999"
; :background "#000"
; :box nil)
;(set-face-attribute 'powerline-active1 nil
; :foreground "#fff"
; :background "#210"
; :inherit 'mode-line)
;(set-face-attribute 'powerline-active2 nil
; :foreground "#0f0"
; :background "#000"
; :inherit 'mode-line)
;; save時にmode line を光らせる
(add-hook 'after-save-hook
(lambda ()
(let ((orig-fg (face-background 'mode-line)))
(set-face-background 'mode-line "dark green")
(run-with-idle-timer 0.1 nil
(lambda (fg) (set-face-background 'mode-line fg))
orig-fg))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 見栄え(いろいろ)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; splash screenを無効にする
(setq inhibit-splash-screen t)
;; font
;;(add-to-list 'default-frame-alist '(font . "ricty-12"))
;; line numberの表示
(require 'linum)
(global-linum-mode 1)
(setq linum-format "%4d ")
;; 行番号と列番号を表示する
(column-number-mode t)
(line-number-mode t)
;; tabサイズ
(setq default-tab-width 4)
;; makefile ではスペースにしない
(add-hook 'makefile-mode-hook (lambda () (setq indent-tabs-mode t)))
;; インデント無効
(electric-indent-mode -1)
;; メニューバーを非表示
(menu-bar-mode 0)
;; ツールバーを非表示
;;(tool-bar-mode 0)
;; default scroll bar消去
;;(scroll-bar-mode -1)
;; 対応する括弧をハイライト
(show-paren-mode 1)
;; rainbow-delimiters を使うための設定
(require 'rainbow-delimiters)
(add-hook 'prog-mode-hook 'rainbow-delimiters-mode)
;; 括弧の色を強調する設定
(require 'cl-lib)
(require 'color)
(defun rainbow-delimiters-using-stronger-colors ()
(interactive)
(cl-loop
for index from 1 to rainbow-delimiters-max-face-count
do
(let ((face (intern (format "rainbow-delimiters-depth-%d-face" index))))
(cl-callf color-saturate-name (face-foreground face) 30))))
(add-hook 'emacs-startup-hook 'rainbow-delimiters-using-stronger-colors)
;;; タイトルバーにファイル名を表示する
;;(setq frame-title-format (format "emacs@%s : %%f" (system-name)))
;; 現在行をアンダーライン
(if (not window-system) (progn
(setq hl-line-face 'underline)
(global-hl-line-mode)
))
;; beacon
(require 'beacon)
(beacon-mode 1)
;; color code
(require 'rainbow-mode)
(add-hook 'css-mode-hook 'rainbow-mode)
(add-hook 'less-mode-hook 'rainbow-mode)
(add-hook 'web-mode-hook 'rainbow-mode)
(add-hook 'html-mode-hook 'rainbow-mode)
;;; 行末の空白を強調表示
(setq-default show-trailing-whitespace t)
(set-face-background 'trailing-whitespace "red")
(add-hook 'fundamental-mode-hook (lambda () (setq show-trailing-whitespace nil)))
(add-hook 'calendar-mode-hook (lambda () (setq show-trailing-whitespace nil)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; いろいろ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; スクロールは1行ごとに(mouse)
(setq mouse-wheel-scroll-amount '(1 ((shift) . 5)))
;; スクロールは1行ごとに. スクロール時のマージン(上下)は5行に.
(setq scroll-conservatively 1)
(setq scroll-margin 5)
;; スクロールの加速をやめる
;(setq mouse-wheel-progressive-speed nil)
;; スクロール時にカーソル位置の保持
(setq scroll-preserve-screen-position t)
;; C-v、 M-v によるページダウン、ページアップの重複行数
(setq next-screen-context-lines 5)
;;;バッファの最後でnewlineで新規行を追加するのを禁止する
(setq next-line-add-newlines nil)
;; bufferの最後でカーソルを動かそうとしても音をならなくする
(defun next-line (arg)
(interactive "p")
(condition-case nil
(line-move arg)
(end-of-buffer)))
;; エラー音をならなくする
(setq ring-bell-function 'ignore)
;;; gz ファイルも編集できるようにする
(auto-compression-mode t)
;;; 画像ファイルを表示する
(auto-image-file-mode t)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; このファイルに間違いがあった場合に全てを無効にします
(put 'eval-expression 'disabled nil)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ---- language-env end DON'T MODIFY THIS LINE!
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(custom-safe-themes
'("3c83b3676d796422704082049fc38b6966bcad960f896669dfc21a7a37a748fa" "7153b82e50b6f7452b4519097f880d968a6eaf6f6ef38cc45a144958e553fbc6" "43f03c7bf52ec64cdf9f2c5956852be18c69b41c38ab5525d0bedfbd73619b6a" "a0feb1322de9e26a4d209d1cfa236deaf64662bb604fa513cca6a057ddf0ef64" "04dd0236a367865e591927a3810f178e8d33c372ad5bfef48b5ce90d4b476481" default))
'(package-selected-packages
'(jq-format swiper badger-theme alect-themes all-the-icons all yasnippet avy-migemo ivy symbol-overlay neotree company tide ## geben phps-mode markdown-mode flycheck yaml-mode go-mode magit)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; 起動高速化(GC減らす)
;;; https://emacs-jp.github.io/tips/startup-optimization
(setq gc-cons-threshold 16777216) ; 16mb
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</pre><div><br /></div><div>いろいろコマンドをインストールしないと使えない機能もあります。</div><div>が、あまり、覚えてない。</div><div>- w3m, markdown (README.mdの表示確認用)</div><div>- cfn-lint (Cloudformation文法チェック用)</div><div>- tf-lint (Terraform文法チェック用)</div><div>- git-delta (ma-git用)</div><div>- aws-cli, docker (リモートファイル操作用)</div><div><br /></div><div>~/.emacs/user は以下のとおり。</div><div>GitHubで探して入手しました。</div><div><pre class="term">-rw-r--r-- 1 blue21 blue21 18075 1月 4 2022 beacon.el
-rw-r--r-- 1 blue21 blue21 16389 1月 29 2022 beacon.elc
-rw-r--r-- 1 blue21 blue21 2142 1月 4 2022 flycheck-flash-mode-line.el
-rw-r--r-- 1 blue21 blue21 3261 1月 29 2022 flycheck-flash-mode-line.elc
</pre></div><div><br /></div><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-30841932502813527782023-02-26T09:22:00.066+09:002023-02-26T09:22:00.196+09:00ログイン画面を通らずにAWSコンソールをコマンド一撃で開いてみる<p><br /></p><p>私のPC環境</p><p>- SparkyLinux6.5</p><p>- aws-cli2.x</p><p>- jq</p><p><br /></p><p>私のAWS環境</p><p>- AWSアカウントが2つあります。</p><p>- 認証用と検証用です。</p><p> </p><p>私がAWSコンソールを使用するときは、サインインするときにMFAの認証コードを入力しています。</p><p>また、認証用アカウントにサインインしてから検証用アカウントにスイッチロールする手順にしています。</p><p><br /></p><p>ちょっと見たいだけのときは、これがめんどくさいので、コマンド一撃で検証用アカウントのAWSコンソールを開くようにしました。</p><p>下記URLの情報を参考にしています。</p><p></p><ul style="text-align: left;"><li><a href="https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html">https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html</a></li></ul><p></p><p><br /></p><p>下記のコードを ~/awsc_open.sh のPATHで保存します。</p><p>ROLE には、スイッチロールで使用するIAM Role名を設定します。</p><p>AUTH_PROFILE には、認証アカウントのprofile名(aws-cli)を設定します。</p><pre class="term">#!/bin/bash
AWS_FED_URL=https://signin.aws.amazon.com/federation
AWS_CONSOLE_URL=https://console.aws.amazon.com/
ROLE=<IamRole>
AUTH_PROFILE=<prfoile>
function urlencode
{
echo $1 | jq -Rr '@uri'
}
arn=$(aws iam list-roles \
--query "Roles[?RoleName == '${ROLE}'].Arn" \
--output text)
if [ "${arn}" == "" ]; then
echo "${ROLE} is not found."
exit 1
fi
key=$(aws sts assume-role \
--profile ${AUTH_PROFILE} \
--role-arn "${arn}" \
--role-session-name OneTimeSession \
--query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \
--output text)
access_key=$(echo "${key}" | awk -F"\t" '{printf("%s",$1)}')
secret_access_key=$(echo "${key}" | awk -F"\t" '{printf("%s",$2)}')
session_token=$(echo "${key}" | awk -F"\t" '{printf("%s",$3)}')
if [ "${access_key}" == "" ]; then
echo "assume-role failed."
exit 1
fi
json="{\"sessionId\":\"${access_key}\",\"sessionKey\":\"${secret_access_key}\",\"sessionToken\":\"${session_token}\"}"
token=$(curl -s "${AWS_FED_URL}?Action=getSigninToken&Session=$(urlencode ${json})" \
| jq -r .SigninToken)
if [ "${token}" == "" ]; then
echo "get signin token failed."
exit 1
fi
url="${AWS_FED_URL}?Action=login&Issuer=&Destination=$(urlencode ${AWS_CONSOLE_URL})&SigninToken=$(urlencode ${token})"
#echo ${url}
google-chrome --incognito ${url}
exit 0
</pre><div><br /></div><p>このファイルを bash aliasに登録します。</p><p>~/.bashrc などに下記のように記載します。</p><pre class="term">alias awsc='~/awsc_open.sh'</pre><p><br /></p><p>ターミナルで awsc と入力してENTERすると、</p><p>下図のようなかんじでAWSコンソールを開けます。</p><p>ログイン画面は通らずに、いきなりホーム画面にいけます。</p><p><br /></p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAKYJhxzfER9HLyzNbqMW_Cxas3ZhVs_n7KJn_62oS-P0PGOZdiA8GnVfvoAlz1z0nMcvs7p-clfdXWYaxHYLu4FzUDJz3FgDpbg3fidrI-ca4PGWBJgEY6BHUDtx4h9TNx9gvUkT38BqFxK1K3S6r9cBNVhbdSAGni1E92GhCE9zoheEW55E4Nnltbg/s1366/awsc.gif" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="768" data-original-width="1366" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAKYJhxzfER9HLyzNbqMW_Cxas3ZhVs_n7KJn_62oS-P0PGOZdiA8GnVfvoAlz1z0nMcvs7p-clfdXWYaxHYLu4FzUDJz3FgDpbg3fidrI-ca4PGWBJgEY6BHUDtx4h9TNx9gvUkT38BqFxK1K3S6r9cBNVhbdSAGni1E92GhCE9zoheEW55E4Nnltbg/s320/awsc.gif" width="320" /></a></div><p><br /></p><p>環境変数のAWS_PROFILEに設定したAWSアカウントのAWSコンソールが開きます。</p><p>Chromeのシークレットモードで開きます。</p><p>セッションの有効期限は1時間です。</p><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-73237328551904873662023-02-23T17:50:00.004+09:002023-05-26T11:17:21.007+09:00EKS(fargate)でargocdを試す環境をCloudformationで作ってみた<p> </p><p>下記の別記事で書いた、terraformで構築したEKS環境をCloudformationで構築してみました。</p><p></p><ul style="text-align: left;"><li><a href="https://blue21neo.blogspot.com/2023/02/eksfargateargocdterraform.html" target="_blank">EKS(fargate)でargocdを試す環境をterraformで作ってみた</a></li></ul><p></p><p style="text-align: left;">ただ、k8sの設定は、Cloudformationで出来ないので、kubectl, helmなどのコマンドを使用しています。</p><div><br />私の環境<div><ul style="text-align: left;"><li>SparkyLinux6.5(Debian系)</li><li>Bitbucket</li><ul><li>ssh秘密鍵(レポジトリアクセス用)</li></ul><li>k8s</li><ul><li>kubectl1.25.4</li><li>helm3.10.2</li></ul><li>aws</li><ul><li>aws-cli2.9.4</li><li>eksctl0.13.0</li><li>rain1.3.0</li><li>cfn-lint0.73.2</li><li>ssh秘密鍵(EC2用キーペア)</li></ul><li>os command</li><ul><li>make</li><li>bash</li><li>jq</li><li>envsubst</li></ul></ul><div><div><br /></div><span style="font-size: small;"><h2 style="text-align: left;">サンプルコード</h2></span></div><div><p style="text-align: left;"><br /></p><p style="text-align: left;"><a href="https://github.com/blue21jp/aws-sample-cfn-eks">https://github.com/blue21jp/aws-sample-cfn-eks</a></p><br /><h2>構成</h2><div><br /></div><pre class="term">.
├── README.md
├── demo_todo.org
├── global/
│ └── variables.mk
├── stacks_base/
│ ├── 01_network/
│ │ ├── Makefile
│ │ └── cfn_vpc.yml
│ ├── 02_prefix_list/
│ │ ├── Makefile
│ │ └── cfn_prefix_list.yml
│ ├── 03_nat/
│ │ ├── Makefile
│ │ └── cfn_nat.yml
│ ├── Makefile
│ ├── variables_all.mk
│ └── variables_prd.mk
└── stacks_eks/
├── 01_vpc/
│ └── Makefile
├── 02_ssm/
│ └── Makefile
├── 10_eks_cluster/
│ ├── Makefile
│ ├── cfn_eks_cluster.yml
│ ├── cfn_eks_fargate_profile.yml
│ └── cfn_eks_oidc.yml
├── 11_k8s_init/
│ └── Makefile
├── 20_k8s_alb_controller/
│ ├── Makefile
│ └── aws_alb_policy.json
├── 20_k8s_eso/
│ ├── Makefile
│ ├── aws_eso_policy.json
│ └── k8s_eso_cluster_secret.yml
├── 20_k8s_metric_server/
│ └── Makefile
├── 21_k8s_argocd/
│ ├── Makefile
│ └── k8s_argocd_ingress.yml
├── 21_k8s_dashboard/
│ ├── Makefile
│ └── k8s_dashboard_ingress.yml
├── 40_app_argocd/
│ ├── Makefile
│ ├── argocd_apps.json
│ ├── argocd_apps.sh
│ ├── argocd_git_repositorys.json
│ ├── argocd_git_repositorys.sh
│ ├── k8s_argocd_app.yml
│ ├── k8s_argocd_repo.yml
│ ├── k8s_external_secret.yaml
│ └── k8s_ingress_app.yml
├── Makefile
├── variables_all.mk
└── variables_prd.mk
</pre><div><br /></div><div>この構成の説明と基本操作方法は、下記の別記事を参照。</div><div>下記の記事はterraform用なので、多少、本記事のCloudformation用とは使用方法(オプションとか)が異なりますが、考え方は同じです。</div><div><ul style="text-align: left;"><li>「<a href="https://blue21neo.blogspot.com/2023/01/awslocalstackterraform.html" target="_blank">awsとlocalstackを切り替えながらterraformを使いたい</a>」</li><li>「<a href="https://blue21neo.blogspot.com/2023/01/docker-desktopk8slocalstackargocdterraf.html" target="_blank">Docker Desktop(k8s)+Localstackでargocdを動かす環境をterraformで作ってみる</a>」</li><li>「<a href="https://blue21neo.blogspot.com/2023/02/eksfargateargocdterraform.html" target="_blank">EKS(fargate)でargocdを試す環境をterraformで作ってみた</a>」</li></ul><div>今回のEKS環境は、前述の別記事(terraform版)と比較して、下記を変えてます。</div><div><ul style="text-align: left;"><li>appは、tf-sample-eks レポジトリを使用します。</li><li>SecurityGrpoupの設定に、マネージドプレフィックスリストを使用しています。</li><li>argocd画面のexecを有効にしています。(GUIからpodに入れる)</li><li>argocd用の設定情報(レポジトリ、アプリケーション)は、40_app_argocdのjsonファイルに記述しています。</li></ul></div><div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">構築</h2><p style="text-align: left;"><br /></p><h4 style="text-align: left;">準備</h4><div><br /></div><div><b>bitbucket</b></div><div>レポジトリアクセス用のSSH秘密鍵は下記のPATHを使用します。</div><div>~/.ssh/id_rsa</div><div><br /></div><div><b>awscli </b></div><div>AWS用のprofile名は "sandbox" を使用します。us-east-1で動作確認しています。</div><div><br /></div><div><b>ec2キーペア</b></div><div>NATインスタンスで使用するキーペアです。"sandbox"を使用します。<br />節約のためにNATゲートウェイでなくNATインスタンスを使ってます。</div><div><br /></div><h4 style="text-align: left;">Cloudformation実行</h4><div><br /></div><div>下記コマンドを実行すると、rain deployやawscli,kubeclt,helm,eksctlが実行されます。</div><div>これで、AWS環境にリソース一式(vpc, eks, ssm, argocd, dashbord, etc)が構築されます。</div><div><pre class="term">$ make -C stacks_base deploy
$ make -C stacks_eks deploy</pre></div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">破棄</h2><div><br /></div><div>下記コマンドを実行するとリソースを全部、破棄します。</div><div><div><pre class="term">$ make -C stacks_eks remove
$ make -C stacks_base remove</pre></div><p style="text-align: left;"><br /></p></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p></div></div></div></div></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-68696827461739542932023-02-19T22:14:00.002+09:002023-02-19T22:14:00.199+09:00Linuxデスクトップで画面操作を録画して編集するときに使ってるツール<p> </p><p>こんなかんじで、録画した画面操作をGIFアニメーションにしてブログに貼り付けることができます。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuVcxfZJI1v4aHNt-LAY4H7jnhfh8rFgKcjAMUwNeQVHSsLAXiqoHqYK5RDXHNwaoK3Uie8ViTzGHMHNelwWqMCV3lF34jUCj41qCn9cH-aD5H00wo0_sQWRG8u8FcHkJYo_jDRFFtrMYzRW6Kbdq9ojw2LFvqMqzBgw6b8INMOaN22zHGo7lSGDc2YQ/s656/sample.gif" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="512" data-original-width="656" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuVcxfZJI1v4aHNt-LAY4H7jnhfh8rFgKcjAMUwNeQVHSsLAXiqoHqYK5RDXHNwaoK3Uie8ViTzGHMHNelwWqMCV3lF34jUCj41qCn9cH-aD5H00wo0_sQWRG8u8FcHkJYo_jDRFFtrMYzRW6Kbdq9ojw2LFvqMqzBgw6b8INMOaN22zHGo7lSGDc2YQ/s320/sample.gif" width="320" /></a></div><p><br /></p><p>私のPC環境は SparkyLinux(Debian系)です。</p><p>私が録画と映像編集に使用しているツールは以下です。</p><p>上の画像も、これで作成しました。</p><p><br /></p><p>■録画</p><p><a href="https://linuxecke.volkoh.de/vokoscreen/vokoscreen.html" target="_blank">vokoscreenNG</a></p><p><br /></p><p>■映像編集</p><p><a href="https://shotcut.org/" target="_blank">shutcut</a></p><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-9525966869055821922023-02-18T20:15:00.001+09:002023-02-18T20:15:00.198+09:00fig は aws-cli のオプション(S3バケット名など)も補完してくれる<p><br /></p><p>fig については下記URL参照</p><p></p><ul style="text-align: left;"><li><a href="https://fig.io/">https://fig.io/</a></li></ul><p></p><p><br /></p><p>fig はコマンドの補完などしてくれる、超便利なツールです。</p><p>aws-cli も補完してくれますが、AWS_PROFILEを認識してAWSを参照し、バケット名なども補完してくれます。</p><p><br /></p><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrldABVuJB9J2hFlw4z2vfhHjfMgSMplKSPFHy1gwPv4l12_NCiX8j_EElBI3_MBs3Omid6rg_ZWlalgOhQfjHcZOnpUZ-kAqdxV5oHExiNDNKtkzM-QwvZhe_YTl1oQrADRsb-vm68wnfeZhIvalfo76ZsQ29YbmnnZfPSyymKb16XIuCLI98yrW03Q/s1050/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-13%2020.14.47.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="182" data-original-width="1050" height="55" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrldABVuJB9J2hFlw4z2vfhHjfMgSMplKSPFHy1gwPv4l12_NCiX8j_EElBI3_MBs3Omid6rg_ZWlalgOhQfjHcZOnpUZ-kAqdxV5oHExiNDNKtkzM-QwvZhe_YTl1oQrADRsb-vm68wnfeZhIvalfo76ZsQ29YbmnnZfPSyymKb16XIuCLI98yrW03Q/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-13%2020.14.47.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"></td></tr></tbody></table><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-64418801503788347102023-02-12T13:08:00.002+09:002023-02-12T13:08:00.193+09:00pecoとrainでCloudFormationのスタックを削除してみる<p><br /></p><p>rain については、下記URLを参照</p><p></p><ul style="text-align: left;"><li><a href="https://dev.classmethod.jp/articles/aws-cloudformation-rain/">https://dev.classmethod.jp/articles/aws-cloudformation-rain/</a></li></ul><p></p><p><br /></p><p>~/.bashrc などに下記を記載します。</p><p> </p><pre class="term">rmstack() {
local stack=$(aws cloudformation describe-stacks \
--query "Stacks[?contains(StackName,\`$1\`)].[StackName,StackStatus,Description]" \
--output text | peco | cut -f1)
rain rm $stack
}
</pre><div><br /></div><div>こんなかんじで使います。</div><div><br /></div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9PRAAoInHrjCydC0x6dTcscZ5fpb_8q4k9eyYI7rpINSWADL9sDJOG3OLc7fVlduLfcKdyqMRyPGKxJz8usR0G3BpDK5gVuJGrgaL3MpQ6TzBKgltvgUBA6GqIg5a7R7-7Rxybpdo-BGnmcc5NqQ8E2j20sB5QqXl4v0vIH0y6ZhwAd5HT_aWnWB2g/s824/rmstack.gif" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="478" data-original-width="824" height="186" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz9PRAAoInHrjCydC0x6dTcscZ5fpb_8q4k9eyYI7rpINSWADL9sDJOG3OLc7fVlduLfcKdyqMRyPGKxJz8usR0G3BpDK5gVuJGrgaL3MpQ6TzBKgltvgUBA6GqIg5a7R7-7Rxybpdo-BGnmcc5NqQ8E2j20sB5QqXl4v0vIH0y6ZhwAd5HT_aWnWB2g/s320/rmstack.gif" width="320" /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><br /><div><br /></div><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-39865919353435563682023-02-06T18:58:00.006+09:002023-02-08T20:25:54.113+09:00よく使うaws-cliは bash のalias とか function にしている<p> </p><p>aws-cliを、~/.bashrcとか~/.bash_aliases などに書いて使ってます。</p><p>--profile は指定せず、環境変数(AWS_PROFILE)でプロファイルを切り替えて使ってます。</p><p><br /></p><h3 style="text-align: left;">EC2関連</h3><p><br /></p>
<pre class="term"># instance
lsec2() {
local filter=""
if [ "$1" == "" ]; then
aws ec2 describe-instances \
--query 'Reservations[].Instances[].{name:Tags[?Key==`Name`]|[0].Value,instanceId:InstanceId,privateIp:PrivateIpAddress,publicIp:PublicIpAddress,image:ImageId,state:State.Name,sg:SecurityGroups[].GroupName|sort(@)|join(`,`,@)}' \
--output table
else
aws ec2 describe-instances \
--filters "Name=tag:Name,Values=$1" \
--query 'sort_by(Reservations[].Instances[].{name:Tags[?Key==`Name`]|[0].Value,instanceId:InstanceId,privateIp:PrivateIpAddress,publicIp:PublicIpAddress,image:ImageId,state:State.Name,sg:SecurityGroups[].GroupName|sort(@)|join(`,`,@)},&name)' \
--output table
fi
}
# tag
lsec2-tag() {
if [ "$1" == "" ]; then
echo "lsec2-tag <resource-id>"
return
fi
aws ec2 describe-tags --filters "Name=resource-id,Values=$1" --output table
}
# security group
lssg() {
local key='*'
if [ "$1" != "" ]; then
key=$1
fi
aws ec2 describe-security-groups \
--filters "Name=group-name,Values=$key" \
--query 'sort_by(SecurityGroups[].{id:GroupId, name:GroupName, vpc:VpcId, desc:Description},&name)' \
--output table
}
lssg-rule() {
if [ "$1" == "" ]; then
echo "lssg-rule <security-group-id>"
return
fi
local key="$1"
aws ec2 describe-security-group-rules \
--filters "Name=group-id,Values=$key" \
--output table
}
# elb
alias lselb="aws elbv2 describe-load-balancers --query 'LoadBalancers[].{schme:Scheme,dns:DNSName,state:State.Code}' --output table"
lselb-tg() {
local cond=""
if [ "$1" != "" ]; then
cond=$(printf '?contains(TargetGroupName,`%s`)' $1)
fi
aws elbv2 describe-target-groups \
--query "TargetGroups[$cond].[TargetGroupArn,TargetGroupName]" \
--output table
}
lselb-health() {
while read key
do
state=$(aws elbv2 describe-target-health \
--target-group-arn "$key" \
--query 'TargetHealthDescriptions[].[TargetHealth.State]' \
--output text)
echo "$key $state"
done< <(aws elbv2 describe-target-groups --query "TargetGroups[].[TargetGroupArn]" --output text)
}
# ami
rmami() {
local ami_ids=$@
for ami_id in $ami_ids;do
snapshot_ids=`aws ec2 describe-images --image-ids=$ami_id \
--query "Images[].BlockDeviceMappings[].Ebs.[SnapshotId]" \
--output text`
echo "deregister image $ami_id"
aws ec2 deregister-image --image-id=$ami_id
for snapshot_id in $snapshot_ids;do
echo "delete snapshot $snapshot_id"
aws ec2 delete-snapshot --snapshot-id=$snapshot_id
done
done
}
lsami() {
local key='*'
if [ "$1" != "" ]; then
key=$1
fi
aws ec2 describe-images --owner self \
--filter "Name=name,Values=$key" \
--query "sort_by(Images[].{name:Name,image:ImageId,date:CreationDate,state:State},&name)" \
--output table
}
# network
lseni()
{
aws ec2 describe-network-interfaces --query 'NetworkInterfaces[].[PrivateIpAddress,Association.PublicIp]' --output text
}
lsvpc() {
aws ec2 describe-vpcs \
--output text \
--query 'Vpcs[].[CidrBlock,VpcId]'
}
lsvpc-sub() {
aws ec2 describe-subnets \
--output text \
--query 'Subnets[].[AvailabilityZone,CidrBlock,SubnetId,VpcId,Tags[?Key==`Name`].Value|[0]]'
}
lsvpc-pl() {
aws ec2 describe-managed-prefix-lists \
--output text \
--query 'PrefixLists[].[PrefixListId,PrefixListName]'
}
</pre>
<p><br /></p><h3 style="text-align: left;">CloudWatchLogs関連</h3><p><br /></p><pre class="term">lslog(){
local cond=""
if [ "$1" != "" ]; then
cond=$(printf '?contains(logGroupName,`%s`)' $1)
fi
aws logs describe-log-groups --query "sort_by(logGroups[$cond].{name:logGroupName,bytes:storedBytes},&name)" --output table
}
rmlog(){
if [ $# -eq 0 ]; then
echo "usage: rmlog <log group name>"
return
fi
aws logs delete-log-group --log-group-name $1
}
taillog(){
if [ $# -eq 0 ]; then
echo "usage: taillog <log group name>"
return
fi
aws logs tail $1 --follow --since 1h
}
</pre><div><br /></div><h3 style="text-align: left;">CloudFormation</h3><div><br /></div><pre class="term">lsstack() {
aws cloudformation describe-stacks \
--query "Stacks[?contains(StackName,\`$1\`)].{StackName:StackName,StackStatus:StackStatus,Desc:Description}" \
--output table
}
rmstack() {
rain rm $1
}</pre><p><br /></p><h3 style="text-align: left;">ECS/EKS/ECR</h3><div><br /></div><pre class="term"># ecr
lsecr-repo() {
aws ecr describe-repositories --query 'repositories[].repositoryName' --output text | tr "\t" "\n"
}
lsecr-img() {
if [ $# -eq 0 ]; then
echo "usage: lsecr-img <repository name>"
return
fi
aws ecr list-images --repository-name $1 --query 'imageIds[].imageTag' --output text
}
rmecr-img() {
if [ $# -eq 0 ]; then
echo "usage: rmecr-img <repository name> <tag>"
return
fi
aws ecr batch-delete-image --repository-name $1 --image-ids imageTag=$2
}
# ecs
lsecs() {
local keyword=.
if [ $# -ne 0 ]; then
keyword=$1
fi
aws ecs list-clusters | jq -r '.clusterArns[]' | cut -d/ -f2 | grep -i $keyword | sort
}
lsecs-task() {
if [ $# -eq 0 ]; then
echo "usage: lsecs-task <cluster name>"
return
fi
local cluster=$1
local tasks=$(aws ecs list-tasks --cluster $cluster --query 'taskArns[]' --output text | tr "\t" " ")
aws ecs describe-tasks --tasks $tasks --output table \
--cluster $cluster \
--query 'tasks[].[group,taskArn, attachments[0].details[?name==`privateIPv4Address`]|[0].value, capacityProviderName, lastStatus]'
}
# eks
lseks() {
local keyword=.
if [ $# -ne 0 ]; then
keyword=$1
fi
aws eks list-clusters | jq -r '.clusters[]'| grep -i $keyword | sort
}
</pre><div><br /></div><h3 style="text-align: left;">SSM</h3><div><br /></div><pre class="term"> alias lsssm='aws ssm describe-parameters --query 'Parameters[].[Name]' --output text | sort'</pre><div><br /></div><p><br /></p><h3 style="text-align: left;">おまけ</h3><p><br /></p><p>上記コマンドを使用して作業している様子です。(動画)</p><p>terraformでAWS環境を構築しながら上記コマンドで構築結果を確認しています。</p><p></p><ul style="text-align: left;"><li><a href="https://youtu.be/AQvGSTyhCWw">https://youtu.be/AQvGSTyhCWw</a></li><li><a href="https://youtu.be/ZpOU54B47sY">https://youtu.be/ZpOU54B47sY</a></li><li><a href="https://youtu.be/ofmbBqLF7kA">https://youtu.be/ofmbBqLF7kA</a></li></ul><p></p><p><br /></p><p> </p>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-61210921261116349302023-02-05T10:43:00.006+09:002023-05-26T11:13:42.289+09:00EKS(fargate)でargocdを試す環境をterraformで作ってみた<p> </p><p>やりたかったこと</p><div><ul style="text-align: left;"><li>EKS(fargate)の環境でk8sを試したい。</li><li>試したいk8sパッケージ</li><ul><li>eso</li><li>metric server</li><li>AWS Load Balancer Controller</li><li>argocd</li><li>kubernetes dashboard</li></ul><li>argocd はBitbucketと連携させてnginxをdeploy</li><li>AWS SSM ParameterStoreに、Bitbuket接続に使用するSSH秘密鍵を登録し、esoでk8sのsecretとして参照できるようにしたい。</li><li>AWS Load Balancer Controllerを使って、ALBを構築し、argocd, dashboardのGUIを見たい。</li><li>metric serverのhpaでpodをスケールアウトしたい。</li><li>個人の学習目的なので、セキュリティはゆるくていい。</li></ul></div><p><br /></p><p>私の環境</p><p></p><ul style="text-align: left;"><li>SparkyLinux6.5(Debian系)</li><ul><li>ssh秘密鍵(レポジトリアクセス用)</li></ul><li>k8s</li><ul><li>kubectl1.25.4</li><li>helm3.10.2</li></ul><li>aws</li><ul><li>aws-cli2.9.4</li><li>ssh秘密鍵(EC2用キーペア)</li></ul><li>terraform</li><ul><li>tfenv3.0.0</li><li>tflint0.43.0</li><li>terraform1.3.7</li></ul></ul><p style="text-align: left;"><br /></p><p style="text-align: left;">主に、下記のサイトを参考にしました。</p><p style="text-align: left;"></p><ul style="text-align: left;"><li><a href="https://antonputra.com/amazon/create-aws-eks-fargate-using-terraform/">https://antonputra.com/amazon/create-aws-eks-fargate-using-terraform/</a></li></ul><p></p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">サンプルコード</h2><p style="text-align: left;"><br /></p><p style="text-align: left;"><a href="https://github.com/blue21jp/aws-sample-terraform-eks">https://github.com/blue21jp/aws-sample-terraform-eks</a></p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">構成</h2><div><br /></div><pre class="term">.
├── Makefile
├── README.md
├── app/
│ ├── nginx/
│ │ ├── README.md
│ │ ├── deployment.yml
│ │ ├── hpa.yaml
│ │ └── service.yml
│ └── php/
│ ├── README.md
│ ├── deployment.yml
│ ├── hpa.yaml
│ └── service.yml
├── demo_todo_k8s.org
├── global/
│ ├── backend.tf
│ ├── ip.sh
│ ├── ip_pub.sh
│ ├── locals.tf
│ ├── providers_aws.tf
│ ├── providers_localstack.tf
│ └── versions.tf
├── modules/
│ └── ec2-spot/
│ ├── main.tf
│ ├── outputs.tf
│ └── variables.tf
├── stacks_base/
│ ├── 00_check/
│ │ ├── Makefile
│ │ └── outputs.tf
│ ├── 01_network/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── main.tf
│ │ └── versions.tf
│ ├── 02_ec2_nat/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── locals.tf
│ │ └── main.tf
│ ├── Makefile
│ ├── locals_all.tf
│ ├── locals_dev.tf
│ └── locals_prd.tf
├── stacks_eks/
│ ├── 00_check/
│ │ ├── Makefile
│ │ └── outputs.tf
│ ├── 01_vpc/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ └── main.tf
│ ├── 02_ssm/
│ │ ├── Makefile
│ │ └── main.tf
│ ├── 10_eks_cluster/
│ │ ├── Makefile
│ │ ├── aws_fargate_profile_app.tf
│ │ ├── aws_fargate_profile_kube_system.tf
│ │ ├── aws_iam_oidc.tf
│ │ ├── datasources.tf
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 20_k8s_alb_controller/
│ │ ├── AWSLoadBalancerController.json
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── iam.tf
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 20_k8s_eso/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── external_secrets_policy.json
│ │ ├── iam.tf
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 20_k8s_metrics_server/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 21_k8s_argocd/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── ingress.tf
│ │ ├── k8s_external_secret.yaml
│ │ ├── k8s_repo.yaml
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ ├── repo.tf
│ │ └── versions.tf
│ ├── 21_k8s_dashboard/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── ingress.tf
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 40_app_argocd/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── ingress.tf
│ │ ├── k8s_argo_app.yaml
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── Makefile
│ ├── README.md
│ ├── locals_all.tf
│ └── locals_prd.tf
└── stacks_template/
├── 00_check/
│ ├── Makefile
│ └── outputs.tf
├── Makefile
├── locals_all.tf
├── locals_dev.tf
├── locals_prd.tf
└── locals_stg.tf
</pre><div><br /></div><div>こんなイメージ</div><div><br /></div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVnmRsQmldn3AUtb32I1pPAl2nndDLc-S1QvdcyIvbbqT7IwXA0GAkAqjq9rT5F5A8QQgrTtvWhkojhJ5bvWBTBE0cLj-KjZL7WoDGUv5ZPYzq_1q-IAUinrRDQO9zlAH6rLENE5KoN91fLhP_KdtGEyDaNqMJe8u4IIDQ1R_xNqgXPPsFxRpCWMAcOw/s421/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="304" data-original-width="421" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVnmRsQmldn3AUtb32I1pPAl2nndDLc-S1QvdcyIvbbqT7IwXA0GAkAqjq9rT5F5A8QQgrTtvWhkojhJ5bvWBTBE0cLj-KjZL7WoDGUv5ZPYzq_1q-IAUinrRDQO9zlAH6rLENE5KoN91fLhP_KdtGEyDaNqMJe8u4IIDQ1R_xNqgXPPsFxRpCWMAcOw/s320/001.png" width="320" /></a></div><br /><div>この構成の説明と基本操作方法は、下記の別記事を参照。</div><div><ul style="text-align: left;"><li>「<a href="https://blue21neo.blogspot.com/2023/01/awslocalstackterraform.html" target="_blank">awsとlocalstackを切り替えながらterraformを使いたい</a>」</li><li>「<a href="https://blue21neo.blogspot.com/2023/01/docker-desktopk8slocalstackargocdterraf.html" target="_blank">Docker Desktop(k8s)+Localstackでargocdを動かす環境をterraformで作ってみる</a>」</li></ul><div>EKS環境は、前述の別記事(DockerDesktop版)と比較して、下記を変えてます。</div><div><ul style="text-align: left;"><li>app/には、deploymentとhpa,searviceのmanifestをおいてます。移動した理由は、argocdでの見え方の違いを試したかったから。<br />ちなみに、ingressをapp/に移動しなかったのは、ALBを削除しないと、EKSを破棄できないから。(make destroy で一括破棄ができなくなる)</li><li>app/には、nginx, phpの2種類をおいてます。phpはhpaのスケールアウト確認用です。</li><li>ingress nginxのかわりにAWS Load Balancer Controllerを使ってます。</li><li>ALBは、自分のpublic ipのみ許可するようにSecurityGroupを設定しています。<br />(public ipの取得は、global/ip_pub.sh で実施)</li></ul></div><div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">構築</h2><p style="text-align: left;"><br /></p><h4 style="text-align: left;">準備</h4><div><br /></div><div><b>bitbucket</b></div><div>レポジトリアクセス用のSSH秘密鍵は下記のPATHを使用します。</div><div>~/.ssh/id_rsa</div><div><br /></div><div><b>awscli </b></div><div>AWS用のprofile名は "sandbox" を使用します。</div><div><br /></div><div><b>ec2キーペア</b></div><div>NATインスタンスで使用するキーペアです。"sandbox"を使用します。<br />節約のためにNATゲートウェイでなくNATインスタンスを使ってます。</div><div><br /></div><h4 style="text-align: left;">Terraform実行</h4><div><br /></div><div>下記コマンドを実行すると、terraform applyが実行されます。</div><div>これで、AWSのEKS環境にリソース一式(vpc, eks, ssm, argocd, dashbord, etc)が構築されます。</div><div><pre class="term">$ make opply ENV=prd OPT="-auto-approve" -C stacks_base
$ make apply ENV=prd OPT="-auto-approve" -C stacks_eks</pre></div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">確認</h2><p style="text-align: left;"><b><br /></b></p><p style="text-align: left;"><b>EKSへのkubectl接続</b></p><p style="text-align: left;">下記コマンドで config を更新</p><p style="text-align: left;">aws eks update-kubeconfig --name eks-main --alias eks-main</p><p style="text-align: left;">EKS作成者だけアクセスできます。</p><p style="text-align: left;">EKSへのアクアセス権限設定については下記URL参照</p><p style="text-align: left;"></p><ul style="text-align: left;"><li><a href="https://dev.classmethod.jp/articles/eks-cluster-access-control/">https://dev.classmethod.jp/articles/eks-cluster-access-control/</a></li></ul><p></p><p style="text-align: left;"><br /></p><div><b>argocdのGUI</b></div><div>http://<ALBのDNS></div><div>Userは、adminです。</div><div>Passwordは下記コマンドで調べます。</div><div><pre class="term">kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=“{.data.password}” | base64 -d; echo</pre></div><div><br /></div><div><b>dashbordのGUI</b></div><div>http://<ALBのDNS></div><div>認証を無効に設定しています。</div><div>認証画面で[スキップ]ボタンをクリックすると入れます。</div><div><br /></div><div><b>app(nginx/php)のページ</b></div><div>http://<ALBのDNS></div><div>nginx(welcome ページ), php(OK)が表示されます。</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">破棄</h2><div><br /></div><div>下記コマンドを実行するとterraform destroyが実行されます。</div><div>を実行し、リソースを全部、破棄します。</div><div><div><pre class="term">$ make destroy ENV=prd OPT="-auto^approve" -C stacks_eks
$ make destroy ENV=prd OPT="-auto-approve" -C stacks_base</pre></div><p style="text-align: left;"><br /></p></div><div><h2>おまけ</h2><p><br /></p><div><a href="https://bitbucket.org/blue21/tf-sample-eks/src/master/demo_todo_k8s.org">demo_todo_k8s.org</a> に記載した手順で構築と動作確認を実施している様子を動画にしました。</div><div><br /></div><div><ul style="text-align: left;"><li><a href="https://youtu.be/AQvGSTyhCWw">https://youtu.be/AQvGSTyhCWw</a></li></ul></div><div><br /></div><div>この動画で実行しているコマンド(aws-cliのalias)については、下記の記事を参照</div><div><br /></div><div><ul style="text-align: left;"><li><a href="https://blue21neo.blogspot.com/2023/02/aws-cli-bash-alias-function.html" target="_blank">よく使うaws-cliは bash のalias とか function にしている</a></li></ul></div><div><br /></div><div><br /></div></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p></div></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-68528086718809994632023-01-26T14:12:00.001+09:002023-01-28T08:21:38.135+09:00pocoで k8s の context を切り替えてみる<p> </p><p>.bashrc などに下記を記述</p><pre class="term">function k8c()
{
local env=$(kubectl config view | egrep '^- context:' -A4 | awk '($0~/name:/){print $2}' | sort | peco)
kubectl config use-context $env
}</pre><p><br /></p><p>ターミナルにk8cと入力してENTERすると context がメニュー表示されるので、選択すると切り替わります。</p><p>starshipなど使ってプロンプトに contextを表示すると便利です。(下記URL参照)</p><p></p><ul style="text-align: left;"><li><a href="https://blog.ayakumo.net/entry/2022/07/16/172130">https://blog.ayakumo.net/entry/2022/07/16/172130</a></li></ul><p></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-36182061666248366512023-01-24T19:16:00.009+09:002023-05-26T11:10:30.599+09:00Docker Desktop(k8s)+Localstackでargocdを試す環境をterraformで作ってみた<p> </p><p>やりたかったこと</p><div><ul style="text-align: left;"><li>DokerDesktop+Localstackの環境でk8sを試したい。</li><li>試したいk8sパッケージ</li><ul><li>eso</li><li>metric server</li><li>ingress nginx</li><li>argocd</li><li>kubernetes dashboard</li></ul><li>argocd はBitbucketと連携させてnginxをdeploy</li><li>LocalstackのSSM ParameterStoreに、Bitbuket接続に使用するSSH秘密鍵を登録し、esoでk8sのsecretとして参照できるようにしたい。</li><li>ingressを使って、argocd, dashboardのGUIを見たい。</li><li>metric serverのhpaでpodをスケールアウトしたい。</li><li>個人の学習目的なので、セキュリティはゆるくていい。</li></ul></div><p><br /></p><p>私の環境</p><p></p><ul style="text-align: left;"><li>SparkyLinux6.5(Debian系)</li><ul><li>ssh秘密鍵(レポジトリアクセス用)</li></ul><li>k8s</li><ul><li>DockerDesktop4.12.0</li><li>kubectl1.25.4</li><li>helm3.10.2</li></ul><li>aws</li><ul><li>localstack1.3.1.dev</li><li>aws-cli2.9.4</li></ul><li>terraform</li><ul><li>tfenv3.0.0</li><li>tflint0.43.0</li><li>terraform1.3.6</li></ul></ul><p style="text-align: left;"><br /></p><h2 style="text-align: left;">サンプルコード</h2><p style="text-align: left;"><br /></p><p style="text-align: left;"><a href="https://github.com/blue21jp/aws-sample-terraform-k8s">https://github.com/blue21jp/aws-sample-terraform-k8s</a></p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">構成</h2><div><br /></div><pre class="term">├── Makefile
├── README.md
├── app/
│ └── deployment.yml
├── demo_todo_k8s.org
├── global/
│ ├── backend.tf
│ ├── ip.sh
│ ├── locals.tf
│ ├── providers_aws.tf
│ ├── providers_localstack.tf
│ └── versions.tf
├── stacks_k8s/
│ ├── 00_check/
│ │ ├── Makefile
│ │ └── outputs.tf
│ ├── 01_aws_ssm/
│ │ ├── Makefile
│ │ └── main.tf
│ ├── 10_k8s_eso/
│ │ ├── Makefile
│ │ ├── k8s_cluster_secret_store.yaml
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 10_k8s_ingress_nginx/
│ │ ├── Makefile
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 10_k8s_metric_server/
│ │ ├── Makefile
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 20_k8s_argocd/
│ │ ├── Makefile
│ │ ├── k8s_argocd_external_secret.yaml
│ │ ├── k8s_repo.yaml
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ ├── repo.tf
│ │ └── versions.tf
│ ├── 20_k8s_dashboard/
│ │ ├── Makefile
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── 40_app_argocd/
│ │ ├── Makefile
│ │ ├── k8s_app.yaml
│ │ ├── k8s_hpa.yaml
│ │ ├── k8s_ingress.yaml
│ │ ├── k8s_service.yaml
│ │ ├── main.tf
│ │ ├── providers.tf
│ │ └── versions.tf
│ ├── Makefile
│ ├── locals_all.tf
│ └── locals_dev.tf
└── stacks_template/
├── 00_check/
│ ├── Makefile
│ └── outputs.tf
├── Makefile
├── locals_all.tf
├── locals_dev.tf
├── locals_prd.tf
└── locals_stg.tf</pre><div>こんなイメージ</div><div><br /></div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEu_3oJ48rWTZi3wwk7NFGBCZFTZ-WeRdJ5w7VMl5B5jV-Ab98yyaOTWuKirfLpcdecGZt75dDDYKm0WUL3SIrH724GXSsa8G6mqNsOYP0j1GEuzFZNDGY_QiKKth60XhmdGydvIJXnJJv9VAp2SN8Drr3Do3SLV6fkTp85gQZqOWi1JmqAkiQ7IJwhQ/s405/002.png"><img border="0" data-original-height="179" data-original-width="405" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEu_3oJ48rWTZi3wwk7NFGBCZFTZ-WeRdJ5w7VMl5B5jV-Ab98yyaOTWuKirfLpcdecGZt75dDDYKm0WUL3SIrH724GXSsa8G6mqNsOYP0j1GEuzFZNDGY_QiKKth60XhmdGydvIJXnJJv9VAp2SN8Drr3Do3SLV6fkTp85gQZqOWi1JmqAkiQ7IJwhQ/s320/002.png" width="320" /></a></div><div><br /></div><div><br /></div>この構成の説明と基本操作方法は、別記事の「<a href="https://blue21neo.blogspot.com/2023/01/awslocalstackterraform.html" target="_blank">awsとlocalstackを切り替えながらterraformを使いたい</a>」を参照。<div>app/ には、argocdでapp(nginx)をdeployするためのmanifestを置いてます。<br /><p style="text-align: left;"><br /></p><h2 style="text-align: left;">構築</h2><p style="text-align: left;"><br /></p><h4 style="text-align: left;">準備</h4><div><br /></div><div><b>Bitbucket</b></div><div>レポジトリアクセス用のSSH秘密鍵は下記のPATHを使用します。</div><div>~/.ssh/id_rsa</div><div><br /></div><div><b>awscli </b></div><div>Localstack用のprofile名は "localstack" を使用します。</div><div><br /></div><div><b>/etc/hosts</b></div><div>下記のホスト名を登録します。ingressに設定してGUIアクセスで使用します。</div><div><pre class="term">127.0.0.1 argocd.example.local
127.0.0.1 nginx.example.local
127.0.0.1 dashboard.example.local</pre></div><div><br /></div><h4 style="text-align: left;">Terraform実行</h4><div><br /></div><div>下記コマンドを実行すると、terraform applyが実行されます。</div><div>これで、Localstack+DockerDesktop環境にリソース一式(ssm, argocd, dashbord, etc)が構築されます。</div><div><pre class="term">$ make apply OPT="-auto-approve" -C stacks_k8s</pre></div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">確認</h2><p style="text-align: left;"><br /></p><div><b>argocdのGUI</b></div><div>http://argocd.example.local</div><div>Userは、adminです。</div><div>Passwordは下記コマンドで調べます。</div><div><pre class="term">kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath=“{.data.password}” | base64 -d; echo</pre></div><div><br /></div><div><b>dashbordのGUI</b></div><div>http://dashboard.example.local</div><div>認証を無効に設定しています。</div><div>認証画面で[スキップ]ボタンをクリックすると入れます。</div><div><br /></div><div><b>app(nginx)のページ</b></div><div>http://nginx.example.local</div><div>nginxの welcome ページが表示されます。</div><p style="text-align: left;"><br /></p><h2 style="text-align: left;">破棄</h2><p style="text-align: left;"><br /></p><div>argocdでdeployしたnginxを削除します。</div><div><pre class="term">$ kubectl delete deploy nginx-deploy<br /></pre></div><div><br /></div><div>下記コマンドを実行するとterraform destroyが実行されます。</div><div>を実行し、リソースを全部、破棄します。</div><div><div><pre class="term">$ make destroy OPT="-auto-approve" -C stacks_k8s</pre></div><p style="text-align: left;"><br /></p></div><h2 style="text-align: left;">おまけ</h2><p style="text-align: left;"><br /></p><div><a href="https://bitbucket.org/blue21/tf-sample-k8s/src/master/demo_todo_k8s.org">demo_todo_k8s.org</a> に記載した手順で構築と動作確認を実施している様子を動画にしました。</div><div><br /></div><div><ul style="text-align: left;"><li><a href="https://youtu.be/ZpOU54B47sY">https://youtu.be/ZpOU54B47sY</a></li></ul></div><div><br /></div><div><div>この動画で実行しているコマンド(aws-cliのalias)については、下記の記事を参照</div><div><br /></div><div><ul><li><a href="https://blue21neo.blogspot.com/2023/02/aws-cli-bash-alias-function.html" target="_blank">よく使うaws-cliは bash のalias とか function にしている</a></li></ul></div><div><br /></div><div><br /></div></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-81355129345140167422023-01-21T12:44:00.002+09:002023-01-21T12:48:52.052+09:00pecoでecsexecしてみる<p><br /></p><p>ecsexec については、下記URL参照。</p><p></p><ul style="text-align: left;"><li><a href="https://dev.classmethod.jp/articles/ecs-exec-for-fish-shell/">https://dev.classmethod.jp/articles/ecs-exec-for-fish-shell/</a></li></ul><div><br /></div><p></p><p>peco でECSタスクをメニュー表示して選択し、ecsexec してコンテナに入れるようにします。</p><p></p><div><p><br /></p><p>下記を ~/.bashrc などに記述します。</p><pre class="term">ecsexec() {
if [ $# -eq 0 ]; then
echo "usage: ecsexec <cluster name>"
return
fi
local cluster=$1
local tasks=$(aws ecs list-tasks --cluster $cluster --query 'taskArns[]' --output text | tr "\t" " ")
local w_task=$(aws ecs describe-tasks \
--cluster $cluster \
--tasks $tasks \
--output json \
|jq -r '.tasks[]|{group:.group,name:.containers[].name,runtimeId:.containers[].runtimeId}' \
| jq -r -s 'map(map(.)) as $rows|$rows[]|@csv' \
| sort \
| peco)
local svc=$(echo $w_task| awk -F, '{print $1}'| cut -d':' -f2| tr -d '"')
local task=$(echo $w_task| awk -F, '{print $3}'| cut -d'-' -f1| tr -d '"')
local container=$(echo $w_task| awk -F, '{print $2}'| tr -d '"')
echo "*************************************************"
echo "cluster : $cluster"
echo "service : $svc"
echo "task : $task"
echo "container: $container"
echo "*************************************************"
aws ecs execute-command \
--cluster $cluster \
--task $task \
--container $container \
--interactive --command "/bin/sh"
}</pre><p><br /></p><p>ターミナルで "ecsexec <クラスタ名>" と入力して実行すると、下図のようにECSタスクが表示されるので選択します。</p><p>メニューには、「サービス名」、「コンテナ名」、「ECSタスクのruntimeId(task-id含む)」が表示されます。</p><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCJDzjukKKExll1Ni8kYAstCk6qdVW7C8HIgC6IC7_AO-EvVFemC__pxHC9nU2tDUYxUEkXBGWFYUZcSyEamR9Wl6E8jXyFUqxYFkL_Xh0cEI-eEdZfX1X-WDfYbUtwRFO6MqJ_alvxwq0YI2gRAtY6QQtTTH6AkOQ64nnMyNxVGNqLOfhs-vJRrIfHA/s654/001.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="95" data-original-width="654" height="46" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCJDzjukKKExll1Ni8kYAstCk6qdVW7C8HIgC6IC7_AO-EvVFemC__pxHC9nU2tDUYxUEkXBGWFYUZcSyEamR9Wl6E8jXyFUqxYFkL_Xh0cEI-eEdZfX1X-WDfYbUtwRFO6MqJ_alvxwq0YI2gRAtY6QQtTTH6AkOQ64nnMyNxVGNqLOfhs-vJRrIfHA/s320/001.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"></td></tr></tbody></table><br /><p><br /></p><p><br /></p><p>ecsexecが成功してコンテナに入ると、下図のように表示されます。</p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiobagGQBZ3kOvOO-6pocslcE6eOoXcsGqU-9ydCwYYJrSX3wqFhpRwn5GWJ2uUWaxS8Ih8Xpef_9LMadnuMOoxlYwu6JV8dJBKUUK5bAOd5HttMlNLQ6ef1-2Fab62z4j3AETVw5UbsPDh2yEGMlC3jBS1-4iLLLI9HwEfpxwC-IxrQIplkigccXQrpw/s778/002.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="446" data-original-width="778" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiobagGQBZ3kOvOO-6pocslcE6eOoXcsGqU-9ydCwYYJrSX3wqFhpRwn5GWJ2uUWaxS8Ih8Xpef_9LMadnuMOoxlYwu6JV8dJBKUUK5bAOd5HttMlNLQ6ef1-2Fab62z4j3AETVw5UbsPDh2yEGMlC3jBS1-4iLLLI9HwEfpxwC-IxrQIplkigccXQrpw/s320/002.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"></td></tr></tbody></table><br /><p><br /></p><p><br /></p><p><br /></p></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-48133713706882360722023-01-15T12:38:00.008+09:002023-05-26T10:47:41.929+09:00環境(awsとlocalstack)を切り替えながらterraformを使ってみた<p><br /></p><p>私がterraformでやりたかったこと</p><p></p><ul style="text-align: left;"><li>環境(awsとlocalstack)を切り替えながらterraformを使いたい</li><li>寝る前にAWSリソース破棄して、翌日、再構築したい(節約のため)</li><li>個人の学習目的なので、terraformのbackendはlocalでいい</li><li>自作moduleは、好きではないが、たまに作るかもしれない</li><li>環境ごとにディレクトリを作りたくない</li><li>環境切り替えにwokspaceは使いたくない</li><li>環境差分は変数にして、awsとlocalstackで同一コードを実行したい</li><li>localstack停止後はリソース消えるので、terraformも初期状態にリセットしたい</li></ul><p></p><p><br /></p><p style="text-align: left;">私の環境</p><div><ul style="text-align: left;"><li>SparkyLinux6.5(debian系)</li><li>terraform1.3.6</li><li>tfenv3.0.0</li><li>tflint0.43.0</li><li>awscli2.9.4</li><li>localstack1.3.1.dev</li><li>make4.3</li><li>aws ec2キーペア(sandbox)</li></ul></div><p></p><p><br /></p><h2 style="text-align: left;">サンプルコード</h2><p><br /></p><p><a href="https://github.com/blue21jp/aws-sample-terraform">https://github.com/blue21jp/aws-sample-terraform</a></p><p><br /></p><p>注意)</p><p>サンプルコードのEC2はキーペア(sandbox)を使用します。</p><p>このキーペアは、terraformで作成しないので、事前に用意するか、コードを修正してください。</p><p><br /></p><h2 style="text-align: left;">構成</h2><div><br /></div><div>コードの構成は下記のとおり。</div><div>terraformコマンドは、Makefileに記述して実行します。</div><div>makeの使用方法については後述。</div><pre class="term">.
├── Makefile
├── README.md
├── global/
│ ├── backend.tf
│ ├── ip.sh
│ ├── locals.tf
│ ├── providers_aws.tf
│ ├── providers_localstack.tf
│ └── versions.tf
├── modules/
│ ├── ec2-spot/
│ │ ├── main.tf
│ │ ├── outputs.tf
│ │ └── variables.tf
│ └── ecs-fargate/
│ ├── cwl.tf
│ ├── iam.tf
│ ├── main.tf
│ └── variables.tf
├── stacks_base/
│ ├── 00_check/
│ │ ├── Makefile
│ │ └── outputs.tf
│ ├── 01_network/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── main.tf
│ │ └── versions.tf
│ ├── 02_ec2_nat/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── locals.tf
│ │ └── main.tf
│ ├── Makefile
│ ├── locals_all.tf
│ ├── locals_dev.tf
│ └── locals_prd.tf
├── stacks_demo/
│ ├── 00_check/
│ │ ├── Makefile
│ │ └── outputs.tf
│ ├── 03_ec2/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── locals.tf
│ │ ├── locals.tf.dev
│ │ ├── locals.tf.prd
│ │ └── main.tf
│ ├── 04_ecs/
│ │ ├── Makefile
│ │ ├── datasources.tf
│ │ ├── locals.tf
│ │ ├── locals.tf.dev
│ │ ├── locals.tf.prd
│ │ ├── main.tf
│ │ ├── taskdef_amzn2.json
│ │ └── taskdef_nginx.json
│ ├── Makefile
│ ├── locals_all.tf
│ ├── locals_dev.tf
│ └── locals_prd.tf
└── stacks_template/
├── 00_check/
│ ├── Makefile
│ └── outputs.tf
├── Makefile
├── locals_all.tf
├── locals_dev.tf
├── locals_prd.tf
└── locals_stg.tf</pre><div style="text-align: left;"><br /></div><div style="text-align: left;">こんなイメージ</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZS1oCLa1mzrSIUA70HekOxYi5gfWCZE-FCUl0EyJKHZHCeyClSNjIQNVkJPHiaGmZaBSQMq4usNjLxYxwd5ebgBS0ajy8JGhYbar7LGDAEJHYUlZ1lmsSJYZrqSpkJqYFEeI8Q0ck3XLS8_R18lO34857niXrmlkY1xgTVPNx_gf50zRwOUyymiQc4A/s252/001.png"><img border="0" data-original-height="173" data-original-width="252" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZS1oCLa1mzrSIUA70HekOxYi5gfWCZE-FCUl0EyJKHZHCeyClSNjIQNVkJPHiaGmZaBSQMq4usNjLxYxwd5ebgBS0ajy8JGhYbar7LGDAEJHYUlZ1lmsSJYZrqSpkJqYFEeI8Q0ck3XLS8_R18lO34857niXrmlkY1xgTVPNx_gf50zRwOUyymiQc4A/s1600/001.png" width="252" /></a></div><div style="text-align: left;"><br /></div><h4 style="text-align: left;">リソース構築用のterraformコードの格納場所</h4><p style="text-align: left;"><b>modules/</b></p><div style="text-align: left;"><ul style="text-align: left;"><li>自作のモジュールは、modules/配下にディレクトリを作成して、そこに置きます。</li></ul><p style="text-align: left;"><b>stacks_xxxx/</b></p><ul style="text-align: left;"><li>構築するリソース(vpc,ec2,etc)は、共通用、デモ用などグループ化してstacks_xxxx/ ディレクトリを作成し、そこに置きます。</li></ul><p style="text-align: left;"><b>stacks_xxxx/NN_xxxxx</b></p><ul style="text-align: left;"><li>stacks_xxxx/ 配下は、「数値で始まるディレクトリ」を作成して、そこにコードを格納します。この「数値で始まるディレクトリ(00_check,01_netowprk,etc)」を、ここではスタックと呼ぶことにします。</li><li>スタックは、ライフサイクルが同じリソースの集まりです。</li><li>スタックの数値の小さいものから構築すると stacks_xxxx が完成するようにします。</li><li>全環境で、同一コード(スタックのコード)を実行します。</li></ul></div><div style="text-align: left;"><br /></div><h4 style="text-align: left;">環境差分の変数を設定する場所</h4><div style="text-align: left;"><p style="text-align: left;"><b>global/</b></p><p style="text-align: left;">全環境の全スタックで参照できます。</p><div><ul><li>locals.tf・・・local.global.XXXXで参照する</li></ul></div><div><br /></div></div><p style="text-align: left;"><b>stacks_xxxx/</b></p><p style="text-align: left;">たとえば、stacks_baseの下記ファイルに定義した変数は、stacks_base配下のスタックだけで参照できます。</p><ul style="text-align: left;"><li>locals_all.tf・・・全環境共通の変数。local.common_all.XXXXで参照する</li><li>locals_dev.tf・・・dev環境用の変数。local.common_env.XXXXで参照する</li><li>locals_stg.tf・・・stg環境用の変数。local.common_env.XXXXで参照する</li><li>lcoals_prd.tf・・・prd環境用の変数。local.common_env.XXXXで参照する</li></ul> <blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div> </div></blockquote><p style="text-align: left;"><b>stacks_xxxd/NN_xxxx</b></p><div><p style="text-align: left;">たとえば、00_chackの下記ファイルに定義した変数は、00_checkだけで参照できます。</p><div><ul style="text-align: left;"><li>locals.tf.dev・・・dev環境用の変数。local.XXXXで参照する</li><li>locals.tf.stg・・・stg環境用の変数。local.XXXXで参照する</li><li>locals.tf.prd・・・prd環境用の変数。local.XXXXで参照する</li></ul><div><br /></div><h4 style="text-align: left;">terraformプラグインのキャッシュ場所</h4><p style="text-align: left;">awsなどのプラグインは、「terraform init」時にダウンロードして、下記にキャッシュします。</p><ul style="text-align: left;"><li>${HOME}/.teraform.d/plugin-cache</li></ul><div style="text-align: left;"></div><div style="text-align: left;"><br /></div><h4 style="text-align: left;">tfstateの格納場所</h4><p style="text-align: left;">terraformのstateは、スタック用ディレクトリ(00_check, 01_network, etc)内に、環境ごとに作成します。</p><ul style="text-align: left;"><li>stacks_xxxx/NN_xxxx/tfstate.d/dev</li><li>stacks_xxxx/NN_xxxx/tfstate.d/stg</li><li>stacks_xxxx/NN_xxxx/tfstate.d/prd</li></ul><div style="text-align: left;"><br /></div><h2 style="text-align: left;">プロビジョニング環境</h2><p>構築する環境は3種類の前提</p><p></p><ul style="text-align: left;"><li>dev・・・ localstack</li><li>stg・・・ awsアカウント ※サンプルコードでは未使用</li><li>prd・・・ awsアカウント</li></ul><p></p><p><br /></p><h4 style="text-align: left;">プロビジョニング先の環境を指定する方法</h4><p>locals_dev.tf, locales_stg.tf, locals_prd.tf でプロビジョニングする環境を指定します。</p><p>下記のようにして、awscliのプロファイル名と、リージョンを設定します。<br />env_typeは、環境を識別するための値(dev|stg|prd)を設定します。</p><div><pre class="term">locals {
common_env = {
env_type = "dev"
profile = "localstack"
region = "us-east-1"
}
}</pre></div><div><br /></div><h4 style="text-align: left;">localstackで使用するサービスを設定する方法</h4><p>global/provisers_localstack.tf で設定します。</p><p>下記のようにして使用するサービスのエンドポイントをlocalstackに向けます。</p><pre class="term"> endpoints {
sts = "http://${data.external.myip.result["ip"]}:4566"
s3 = "http://${data.external.myip.result["ip"]}:4566"
ec2 = "http://${data.external.myip.result["ip"]}:4566"
route53 = "http://${data.external.myip.result["ip"]}:4566"
cloudwatch = "http://${data.external.myip.result["ip"]}:4566"
iam = "http://${data.external.myip.result["ip"]}:4566"
eks = "http://${data.external.myip.result["ip"]}:4566"
wafregional = "http://${data.external.myip.result["ip"]}:4566"
wafv2 = "http://${data.external.myip.result["ip"]}:4566"
waf = "http://${data.external.myip.result["ip"]}:4566"
cloudfront = "http://${data.external.myip.result["ip"]}:4566"
lambda = "http://${data.external.myip.result["ip"]}:4566"
secretsmanager = "http://${data.external.myip.result["ip"]}:4566"
cloudformation = "http://${data.external.myip.result["ip"]}:4566"
ssm = "http://${data.external.myip.result["ip"]}:4566"
}</pre><p><br /></p><h2 style="text-align: left;">使い方</h2><p style="text-align: left;">terraformコマンドは、makeで実行します。</p><div>ここでは、特に記載がなければ、TOPディレクトリでmakeコマンドを実行します。</div><div><br /></div><h4 style="text-align: left;">動作環境の確認</h4><p style="text-align: left;">stacks_xxxx/00_check を使用します。このスタックは動作環境の情報を表示するだけでリソースは何もつくりません。</p><p style="text-align: left;"><b>dev(localstack)に向ける場合</b></p><p style="text-align: left;">これで terraformの init, tflint, planが実行されます。</p><pre class="term">$ make plan -C stacks_base/00_check</pre><div>実行前の00_checkは下記のとおり</div><div><pre class="term">Permissions Size User Date Modified Name
.rw-r--r-- 6 blue21 14 Jan 16:23 .terraform-version
.rw-r--r-- 2.6k blue21 14 Jan 16:23 Makefile
.rw-r--r-- 246 blue21 14 Jan 16:23 outputs.tf</pre></div><p style="text-align: left;">実行後の00_checkは下記のようになります。</p><p style="text-align: left;">アンダースコアで始まるシンボリックリンク・ディレクトリは make で自動生成したものです。</p><div><div><pre class="term">Permissions Size User Date Modified Name
drwxr-xr-x - blue21 14 Jan 19:04 .terraform
.rw-r--r-- 6 blue21 14 Jan 16:23 .terraform-version
.rw-r--r-- 464 blue21 14 Jan 19:04 .terraform.lock.hcl
lrwxrwxrwx 23 blue21 14 Jan 19:04 _backend.tf -> ../../global/backend.tf
lrwxrwxrwx 16 blue21 14 Jan 19:04 _locals_all.tf -> ../locals_all.tf
lrwxrwxrwx 16 blue21 14 Jan 19:04 _locals_env.tf -> ../locals_dev.tf
lrwxrwxrwx 22 blue21 14 Jan 19:04 _locals_global.tf -> ../../global/locals.tf
lrwxrwxrwx 36 blue21 14 Jan 19:04 _providers.tf -> ../../global/providers_localstack.tf
drwxr-xr-x - blue21 14 Jan 19:04 _tfstate.d
lrwxrwxrwx 24 blue21 14 Jan 19:04 _versions.tf -> ../../global/versions.tf
.rw-r--r-- 2.6k blue21 14 Jan 16:23 Makefile
.rw-r--r-- 246 blue21 14 Jan 16:23 outputs.tf</pre></div></div><div><br /></div><div><p style="text-align: left;"><b>prd(aws)に向ける場合</b></p><p style="text-align: left;">ENVで環境を指定します。(dev|stg|prd)</p><pre class="term">$ make plan ENV=prd -C stacks_base/00_check</pre><div>シンボリックリンク先は prd 用に変わります。</div></div><div><pre class="term">ermissions Size User Date Modified Name
drwxr-xr-x - blue21 14 Jan 19:07 .terraform
.rw-r--r-- 6 blue21 14 Jan 16:23 .terraform-version
.rw-r--r-- 464 blue21 14 Jan 19:04 .terraform.lock.hcl
lrwxrwxrwx 23 blue21 14 Jan 19:07 _backend.tf -> ../../global/backend.tf
lrwxrwxrwx 16 blue21 14 Jan 19:07 _locals_all.tf -> ../locals_all.tf
lrwxrwxrwx 16 blue21 14 Jan 19:07 _locals_env.tf -> ../locals_prd.tf
lrwxrwxrwx 22 blue21 14 Jan 19:07 _locals_global.tf -> ../../global/locals.tf
lrwxrwxrwx 29 blue21 14 Jan 19:07 _providers.tf -> ../../global/providers_aws.tf
drwxr-xr-x - blue21 14 Jan 19:07 _tfstate.d
lrwxrwxrwx 24 blue21 14 Jan 19:07 _versions.tf -> ../../global/versions.tf
.rw-r--r-- 2.6k blue21 14 Jan 16:23 Makefile
.rw-r--r-- 246 blue21 14 Jan 16:23 outputs.tf</pre></div><div><br /></div><h4 style="text-align: left;">スタックのapply</h4><p style="text-align: left;">例として、stacks_base/01_network を使用します。</p><p style="text-align: left;">このスタックはVPC,Subnetを作成します。</p><p style="text-align: left;"><b>dev(localstack)に向ける場合</b></p><div><div><pre class="term">$ make apply -C stacks_base/01_network</pre></div><p style="text-align: left;"><b>prd(aws)に向ける場合</b></p></div><pre class="term">$ make apply ENV=prd -C stacks_base/01_network</pre><p style="text-align: left;">ちなみに、terraform apply に引数を追加したい場合は下記のようにします。</p><div><pre class="term">$ make apply ENV=prd OPT="-auto-approve" -C stacks_base/01_network</pre><p style="text-align: left;">また、stacks_baseのスタックを一括でapplyしたい場合は以下のようにします。</p><pre class="term">$ make apply ENV=prd OPT="-auto-approve" -C stacks_base</pre><p style="text-align: left;"><br /></p><h4>スタックのdesttroy</h4><p>例として、stacks_base/01_network を使用します。</p><p>使用方法は apply と同じです。</p><p><b>dev(localstack)に向ける場合</b></p><div><div><pre class="term">$ make destroy -C stacks_base/01_network</pre></div><p><b>prd(aws)に向ける場合</b></p></div><pre class="term">$ make destroy ENV=prd -C stacks_base/01_network</pre><p style="text-align: left;"><br /></p><h4 style="text-align: left;">初期化</h4><p style="text-align: left;">localstack, awsのリソースを全部destroyしたあとに、下記を実行すると、tfstateやmakeが自動生成したシンボリックリンクを削除して初期状態に戻します。</p><pre class="term">$ make clean ENV=prd -C stacks_base/01_network</pre><p style="text-align: left;"><br /></p><h4>その他</h4></div></div></div><p style="text-align: left;"></p><ul style="text-align: left;"><li>make list -C stacks_xxxx/NN_xxxx<br />tarraform state list を実行します。<br /><br /></li><li>make outputs -C stacks_xxxx/NN_xxxx<br />terraform output を実行します。<br /><br /></li><li>make mv OPT="xxxx yyyy" -C stacks_xxxx/NN_xxxx<br />terraform state mv $OPT を実行します。<br /><br /></li><li>make rm OPT="xxx" -C stacks_xxxx/NN_xxxx<br />terraform state rm $OPT を実行します。<br /><br /></li><li>make import OPT="xxx yyyy" -C stacks_xxxx/NN_xxxx<br />terrafprm import $OPT を実行します。</li></ul><p></p><p style="text-align: left;"><br /></p><div><h4>おまけ</h4></div><p style="text-align: left;">サンプルコードを使って、<a href="https://bitbucket.org/blue21/tf-sample-localstack/src/master/demo_todo.org">demo_todo.org</a>の手順で実施した構築作業を動画にしました。</p><p style="text-align: left;"></p><ul style="text-align: left;"><li><a href="https://youtu.be/ofmbBqLF7kA">https://youtu.be/ofmbBqLF7kA</a></li></ul><p></p><p style="text-align: left;"><br /></p><div>この動画で実行しているコマンド(aws-cliのalias)については、下記の記事を参照</div><div><br /></div><div><ul><li><a href="https://blue21neo.blogspot.com/2023/02/aws-cli-bash-alias-function.html" target="_blank">よく使うaws-cliは bash のalias とか function にしている</a></li></ul></div><div><br /></div><div><br /></div><p style="text-align: left;"><br /></p><p style="text-align: left;"><br /></p><div><br /></div><div><br /></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-59323124315576374612023-01-08T10:11:00.002+09:002023-02-07T12:17:06.197+09:00pecoでawscliのprofileを切り替える<p><br /></p><p>peco は、「brew install peco」などとするとインストールできます。</p><p><br /></p><p>~/.bashrcなどに下記を記述します。</p>
<pre class="term">alias awsa='aws sts get-caller-identity'
export AWS_PROFILE='sandbox'
function awsp()
{
export AWS_PROFILE=$(egrep '^\[profile' ~/.aws/config | cut -d" " -f2 | tr -d ']' | peco)
}
</pre>
<p><br /></p><p>ターミナルで"awsp"と入力して実行すると、下図のように awscliのprofileを選択するメニューが表示されるので、profileを選択すると環境変数のAWS_PROFILEに選択したprofileが設定されます。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr1roLA4LUQSObJb9wgyDPNSUTSCcQZMtlVdjvOCNtfFi0uIo7xTrEvnqVCAC3Q09IJNf8TMiSCDQyfRzDj-TF_HCyAIMsKLWXUXD_sc7RXRkml37PkO2H179qlTx_-m5UDujr1BS638pIZUtbUKsz7dn9NjU1aPrEmVyfnkHd5wg-KER3RkVJHPfUzQ/s667/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="198" data-original-width="667" height="95" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgr1roLA4LUQSObJb9wgyDPNSUTSCcQZMtlVdjvOCNtfFi0uIo7xTrEvnqVCAC3Q09IJNf8TMiSCDQyfRzDj-TF_HCyAIMsKLWXUXD_sc7RXRkml37PkO2H179qlTx_-m5UDujr1BS638pIZUtbUKsz7dn9NjU1aPrEmVyfnkHd5wg-KER3RkVJHPfUzQ/s320/001.png" width="320" /></a></div><p><br /></p><p><a href="https://starship.rs/ja-JP/" target="_blank">starship</a>など使用してターミナルのプロンプトにAWS_PROFILEを表示するようにしておくと便利です。</p><p><br /></p><p>また、ターミナルで"awsa"と入力して実行すると、アカウントIDを確認できます。</p><br /><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-19873555535463287122022-02-06T14:56:00.002+09:002022-02-06T15:18:41.086+09:00fig のautocompleteが動かなくなったのは PROMPT_COMMANDが原因だった<p> </p><p>私の環境は以下のとおり。</p><p></p><ul style="text-align: left;"><li>MacOS: 12.0.1</li><li>bash: 5.1.8 (homebrew)</li><li>iterm2</li></ul><div><br /></div><div>fig のautocompleteを利用してます。すごく便利です。</div><div><ul style="text-align: left;"><li><a href="https://fig.io/">https://fig.io/</a></li></ul></div><div>また、synth-shell でプロンプトの見栄えを変えてます。</div><div><ul style="text-align: left;"><li><a href="https://github.com/andresgongora/synth-shell">https://github.com/andresgongora/synth-shell</a></li></ul><div><br /></div></div><div>今までは、問題なくfigが使えてたのですが、fig をアップデートしたら、autocompleteのメニューが表示されなくなりました。</div><div>色々調べたら、synth-shell が 環境変数のPROMPT_COMMANDを上書きしているのが原因だったみたい。</div><div><br /></div><div>file: ~/.config/synth-shell/synth-shell-prompt.sh</div><pre class="prettyprint linenums"> ## ADD HOOK TO UPDATE PS1 AFTER EACH COMMAND
## Bash provides an environment variable called PROMPT_COMMAND.
## The contents of this variable are executed as a regular Bash command
## just before Bash displays a prompt.
## We want it to call our own command to truncate PWD and store it in NEW_PWD
PROMPT_COMMAND=prompt_command_hook</pre><div><br /></div><div>これを、下記のように修正したら fig がうごくようになりました。</div><div><pre class="prettyprint linenums"> ## ADD HOOK TO UPDATE PS1 AFTER EACH COMMAND
## Bash provides an environment variable called PROMPT_COMMAND.
## The contents of this variable are executed as a regular Bash command
## just before Bash displays a prompt.
## We want it to call our own command to truncate PWD and store it in NEW_PWD
local x=prompt_command_hook
PROMPT_COMMAND="${x} ${PROMPT_COMMAND}"</pre></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-55870751303583035212021-10-18T20:56:00.001+09:002021-10-18T21:15:59.598+09:00blogspotのGoogleSearchでサーバーエラー(5xx)になる<p> </p><p>いつのまにか、GoogleSearchで5XXエラーが多発するようになっていた。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirbQGneBasU4FXYb-7UBQINlOFYT5H4fVE46QuW8nEBp728FfUB4BREdztUSuno_SEVDXxrR0pkls5cEwMkch-fhECuccDexHJLfGXWzXNJb_2vh-qQdnHmJVkIL-SjdUqqnmljNj87zX1/s1405/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="652" data-original-width="1405" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirbQGneBasU4FXYb-7UBQINlOFYT5H4fVE46QuW8nEBp728FfUB4BREdztUSuno_SEVDXxrR0pkls5cEwMkch-fhECuccDexHJLfGXWzXNJb_2vh-qQdnHmJVkIL-SjdUqqnmljNj87zX1/w400-h185/001.png" width="400" /></a></div><p><br /></p><p>下記記事を参考に対処したら、エラーは出なくなりました。</p><p><a href="https://www.amanchourasia.in/2021/06/how-to-fix-server-error-5xx-in-blogger.html">https://www.amanchourasia.in/2021/06/how-to-fix-server-error-5xx-in-blogger.html</a></p><p><br /></p><p><br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><p></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-28244020388022536062021-07-04T08:59:00.003+09:002021-07-04T09:03:05.058+09:00docker の rainで cloudformation してみる<p> </p><p>rain の dockerイメージを作ります。</p><p>Dokerfileは以下のとおり。</p><p>User, Group は、rain を使用するユーザに合わせています。</p><pre class="prettyprint linenums">FROM amazon/aws-cli:latest
ARG RAIN_VER=1.2.0
ARG UID=1000
ARG GID=1000
ARG GNM=ubuntu
ARG UNM=ubuntu
ADD https://github.com/aws-cloudformation/rain/releases/download/v${RAIN_VER}/rain-v${RAIN_VER}_linux-amd64.zip /tmp/rain.zip
# Install Rain
RUN yum install unzip -y \
&& unzip -j /tmp/rain.zip */rain -d /usr/local/bin/ \
&& chmod 755 /usr/local/bin/rain \
&& rm /tmp/rain.zip
# user
RUN echo "${GNM}:x:${GID}:${UID}" >> /etc/group
RUN echo "${UNM}:x:${UID}:${GID}::/home/ubuntu:/sbin/nologin" >> /etc/passwd
ENTRYPOINT ["/usr/local/bin/rain"]</pre><p><br /></p><p>ビルドします。</p><pre class="term">$ docker build . -t aws-rain</pre><p><br /></p><p>ビルドしたDockerイメージを確認します。</p><pre class="term">$ id
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
$ docker run --rm --entrypoint bash aws-rain -c "id ubuntu"
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu)
$ docker run --rm aws-rain --version
Rain v1.2.0 linux/amd64</pre><p><br /></p><p>Dockerイメージを実行するスクリプトを用意します。</p><p>今回は、/usr/local/bin/rain にします。</p><p>内容は以下のとおり。</p><pre class="term">$ cat /usr/local/bin/rain
#!/bin/bash
docker run -it --rm -v $HOME:$HOME -u ubuntu -w $PWD aws-rain $*</pre><p>実行権限をつけます。</p><pre class="term">$ chmod +x /usr/local/bin/rain</pre><p><br /></p><p>rainの動作確認をします。</p><pre class="term">$ rain ls --profile sandbox
CloudFormation stacks in us-east-1:
Blue21VpcPoC: CREATE_COMPLETE</pre><p><br /></p><p>docker イメージにはホームディレクトリをマウントしているので、CFNテンプレートをホームディレクトリに置いて、rainを使うようにします。</p><p>また、上記の例だと、PC側のubuntuユーザにaws-cli の設定(~/.aws)が必要です。</p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-26044520220801844302021-07-03T09:59:00.000+09:002021-07-03T09:59:05.659+09:00EC2インスタンスのタグ(Name)とSSMでSSHしてみる<p> </p><p>EC2インスタンスのタグ(Name)でSSHしてみたいと思います。</p><p><br /></p><p>まず、SSMで ssh できることを確認します。</p><p>セットアップの手順は下記ページを参考にしてください。</p><p></p><ul style="text-align: left;"><li><a href="https://dev.classmethod.jp/articles/ssh-through-session-manager/" target="_blank">https://dev.classmethod.jp/articles/ssh-through-session-manager/</a></li></ul><p></p><p><br /></p><p>~/.ssh/config は下記のとおり。</p><pre class="term">Host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --profile sandbox --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"</pre><p><br /></p><p>下図のようにssh接続します。</p><p>aws-cliを実行するので、接続するまで、少し遅いです。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIzkqLIyxlioyPVJXKyEH-2Rv320a2RRS4Xzb-MouicKvwUaoX0aKkXzzVAWP0hhg2DMD72YeocSC8Jt1w2Ow1ua_TWmMO6lQAeup7kGSwLdu5JvD37bIZvtbsLdRetrw80qvpUFtao-Tx/s827/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="214" data-original-width="827" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIzkqLIyxlioyPVJXKyEH-2Rv320a2RRS4Xzb-MouicKvwUaoX0aKkXzzVAWP0hhg2DMD72YeocSC8Jt1w2Ow1ua_TWmMO6lQAeup7kGSwLdu5JvD37bIZvtbsLdRetrw80qvpUFtao-Tx/s320/001.png" width="320" /></a></div><br /><p>こんどは、~/.ssh/config は下記のようにします。</p><p>"--target" に指定するインスタンスIDを aws-cli で検索します。</p><p>なお、%h は大文字を小文字に置き換えるので、EC2インスタンスのタグ(Name)は、アルファベット小文字にしないと失敗します。</p><pre class="term">Host sbx-*
ProxyCommand bash -c "aws ssm start-session --profile sandbox --target $(aws ec2 describe-instances --profile sandbox --filters "Name=tag:Name,Values=%h" "Name=instance-state-name,Values=running" --query "Reservations[].Instances[].InstanceId" --output text) --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"</pre>
<p><br /></p><p>下図のようにEC2インスタンスのタグ(Name)でssh接続します。</p><p>aws-cli を2回実行するので、接続するまで、さらに遅いです。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUgFdBL-t7Vl9ODYCNAy0abS_F9hRp0-TzhLHCSt0D07bd-lucb_2N84lDsJz15TaG4KZFdH3D4a1rF2c-YJW0uUUMn729mpniDwFKBJKcp2hUsoyZGkw7PIfChMoc9gIgseYDN2KCqpZC/s709/002.png" imageanchor="1" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="222" data-original-width="709" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUgFdBL-t7Vl9ODYCNAy0abS_F9hRp0-TzhLHCSt0D07bd-lucb_2N84lDsJz15TaG4KZFdH3D4a1rF2c-YJW0uUUMn729mpniDwFKBJKcp2hUsoyZGkw7PIfChMoc9gIgseYDN2KCqpZC/s320/002.png" width="320" /></a></div><br /><p><br /></p><p><br /></p>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-5648838723062152412021-07-01T19:46:00.000+09:002021-07-01T19:46:21.428+09:00Linux Mint 20.1 でwi-fi 接続が切れまくる<p><br /></p><p>下記の古いマシンに「Linux Mint 20.1」をインストールしました。</p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTEGZH8lwvFxqsyyGDXRRGniQx_MiZSqcwSLje25ag0RsK38JWjX7xw6_ox6nW3hmYk47IpE_AHfoGyXcSkpDUahSx_DltrdeVyxkXzF0vcPQKQBUARaV0-66NwetnSga2miOz9yhEPf1P/s683/Screenshot+at+2021-06-30+08-44-12.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="429" data-original-width="683" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTEGZH8lwvFxqsyyGDXRRGniQx_MiZSqcwSLje25ag0RsK38JWjX7xw6_ox6nW3hmYk47IpE_AHfoGyXcSkpDUahSx_DltrdeVyxkXzF0vcPQKQBUARaV0-66NwetnSga2miOz9yhEPf1P/s320/Screenshot+at+2021-06-30+08-44-12.png" width="320" /></a></div><div><br /></div><br /><h3 style="text-align: left;"> WiFiが切れまくる</h3><p><br /></p><p>LANケーブルでのネット接続は問題なかったのですが、wi-fi が切れまくります。</p><p>1~3分ぐらいで切れます。</p><p>lspci は下記のとおり</p><pre class="term">$ lspci
00:00.0 Host bridge: Intel Corporation 3rd Gen Core processor DRAM Controller (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)
00:16.0 Communication controller: Intel Corporation 7 Series/C216 Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 7 Series/C216 Chipset Family High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 7 Series/C216 Chipset Family PCI Express Root Port 1 (rev c4)
00:1c.1 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 2 (rev c4)
00:1c.2 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 3 (rev c4)
00:1d.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation HM76 Express Chipset LPC Controller (rev 04)
00:1f.2 SATA controller: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04)
00:1f.3 SMBus: Intel Corporation 7 Series/C216 Chipset Family SMBus Controller (rev 04)
01:00.0 Network controller: Ralink corp. RT3290 Wireless 802.11n 1T/1R PCIe
01:00.1 Bluetooth: Ralink corp. RT3290 Bluetooth
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL810xE PCI Express Fast Ethernet controller (rev 05)
03:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS5229 PCI Express Card Reader (rev 01)
</pre><div><br /></div><p>ネットで調べると、</p><p>「ipv6 が悪さすることがあるらしい。」</p><p>ということで、</p><p>ipv6 を無効にして、OS再起動してみましたが、効果ありませんでした。</p><p>/etc/sysctl.conf の修正内容は下記のとおり。</p><pre class="term">net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1</pre><p><br /></p><p>/var/log/syslog を見ると下記のようなメッセージがでています。</p><pre class="term">Jun 27 21:36:10 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: wlo1: CTRL-EVENT-BEACON-LOSS
Jun 27 21:36:12 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: message repeated 2 times: [ wlo1: CTRL-EVENT-BEACON-LOSS ]
Jun 27 21:36:13 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: wlo1: CTRL-EVENT-BEACON-LOSS
Jun 27 21:36:14 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: wlo1: CTRL-EVENT-BEACON-LOSS
Jun 27 21:36:15 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: wlo1: CTRL-EVENT-BEACON-LOSS
Jun 27 21:36:18 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: wlo1: CTRL-EVENT-BEACON-LOSS
Jun 27 21:36:27 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: message repeated 9 times: [ wlo1: CTRL-EVENT-BEACON-LOSS ]
Jun 27 21:36:28 HP-Pavilion-g6-Notebook-PC wpa_supplicant[612]: wlo1: CTRL-EVENT-BEACON-LOSS </pre><p><br /></p><p>さらに、調べていると、</p><p>「wi-fiの省電力モードが悪さすることがあるらしい。」</p><p>といことで、</p><p>wi-fiの省電力モードを無効にしました。</p><p>/etc/NetworkManager/conf.d/default-wifi-powersave-on.confの修正内容は下記のとおり。</p><pre class="term">[connection]
#wifi.powersave = 3
wifi.powersave = 2</pre><p><br /></p><p>OS再起動すると、wi-fi が切れなくなりました。</p><p>省電力モードが悪さしてたようです。</p><p>問題解消です。</p><p>ちなみに、syslog には、前述のメッセージが出なくなりました。</p><p><br /></p><p><br /></p><h3 style="text-align: left;">chrome</h3><p><br /></p><p>最初は、chromium を入れてみたのですが、Googleアカウントへのログイン状態が維持されなかったので削除しました。</p><p>GoogleのChromeを入れたら、ちゃんと動いてます。</p><p><br /></p><p><br /></p><h3 style="text-align: left;">VirtualBox</h3><div><br /></div><p style="text-align: left;">「このPCがSecureBoot環境」なので、VirtualBox のインストールではパスワード入力を求められます。</p><p style="text-align: left;">パスワード(12345678)を入力して、再起動すると、見慣れないBOOTメニューが表示されますが、ここから MOK の登録作業が必要です。</p><p style="text-align: left;">ContinueせずEnroll MOKを選択し、先ほど設定したパスワードを入力して、キーを Enroll(登録)したら rebootします。</p><p style="text-align: left;">これでVirtualBoxが使えるようになります。</p><div><pre class="term">$ /etc/init.d/virtualbox status
● virtualbox.service - LSB: VirtualBox Linux kernel module
Loaded: loaded (/etc/init.d/virtualbox; generated)
Active: active (exited) since Wed 2021-06-30 07:20:08 JST; 8min ago
Docs: man:systemd-sysv-generator(8)
Process: 950 ExecStart=/etc/init.d/virtualbox start (code=exited, status=0/SUCCESS)
6月 30 07:20:07 HP-Pavilion-g6-Notebook-PC systemd[1]: Starting LSB: ….
6月 30 07:20:07 HP-Pavilion-g6-Notebook-PC virtualbox[950]: * Loadin….
6月 30 07:20:08 HP-Pavilion-g6-Notebook-PC virtualbox[950]: ...done.
6月 30 07:20:08 HP-Pavilion-g6-Notebook-PC systemd[1]: Started LSB: V….
Hint: Some lines were ellipsized, use -l to show in full.
</pre><div><br /></div><div><br /></div><h3 style="text-align: left;">開発用にいれたものたち</h3><p><br /></p><p></p><ul style="text-align: left;"><li>emacs 26.3</li><li>docker 20.10.7</li><li>docker-compose 1.25.0</li><li>virtualbox 6.1.16</li><li>vagrant 2.2.6</li><li>aws-cli 2.2.14</li><ul><li>session-manager-plugin 1.2.205.0-1</li><li>awscli-plugin-endpoint 0.4</li><li>aws-mfa 0.0.12</li></ul><li>sam-cli 1.24.1</li><li>homebrew 3.2.0</li><ul><li>rain 1.2.0</li></ul></ul><p></p><p><br /></p><p><br /></p></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-6799740528059358982021-06-27T13:06:00.004+09:002021-06-27T13:17:18.757+09:00awsでスイッチロールしてみる<p> </p><p>下記要件でクロスアカウントでスイッチロールしてみます。</p><p></p><ul style="text-align: left;"><li>AWSアカウントは2つ</li><li>IAMユーザ用アカウント</li><ul><li>IAMユーザ作るのは、ここだけ</li><li>スイッチしない場合は、認証、MFA設定、パスワード変更だけできる</li></ul><li>開発用アカウント</li><ul><li>IAMユーザなし</li><li>「IAMユーザ用アカウント」からスイッチロールして入る</li></ul><li>MFAで2段階認証した場合だけスイッチできる</li><ul><li><a href="https://dev.classmethod.jp/articles/iam-assume-role-policy-condition-using-boolifexists/">https://dev.classmethod.jp/articles/iam-assume-role-policy-condition-using-boolifexists/</a></li></ul><li>スイッチするときはユーザ名を伝える。(CloudTrailがユーザ名で検索できる)</li><ul><li><a href="https://www.beex-inc.com/blog/add_role_session_name/">https://www.beex-inc.com/blog/add_role_session_name/</a></li></ul></ul><p></p><p><br /></p><h2 style="text-align: left;">IAMユーザ用アカウントでの作業</h2><div><br /></div><div>作成するもの</div><div><ul><li>IAMロール(スイッチ用)</li><li>IAMグループ(ログイン用)</li><li>IAMユーザ(ログイン用)</li></ul></div><div><br /></div><h3 style="text-align: left;">IAMロール作成</h3><div><br /></div><div>スイッチ用のロールを作ります。</div>IAMユーザでログイン後、このロールにスイッチして「IAMユーザ用アカウント」で作業するようにします。<div><div><br /></div><div>CloudFromationテンプレートのサンプルは下記のとおり。</div>パラメータの${AccountId} の部分には、「IAMユーザ用アカウント」のAWSアカウントIDを指定します。<div><div>ConditionでスイッチするIAMユーザ名の有無をチェックしています。この条件は、Versionが 2012-10-17 より古いと使用できないようです。</div><div>ちなみに、rain は、IAMユーザ名を伝えられないようなので、rainを使いたい場合は、このConditionは削除したほうが良さそうです。<br /><pre class="prettyprint linenums"> SwitchRoleDev:
Type: AWS::IAM::Role
Properties:
RoleName: Blue21DemoDevRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS:
- !Sub arn:aws:iam::${AccountId}:root
Action:
- 'sts:AssumeRole'
Condition:
StringLike:
sts:RoleSessionName: ${aws:username}
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonS3FullAccess
- arn:aws:iam::aws:policy/AmazonEC2FullAccess
- arn:aws:iam::aws:policy/IAMReadOnlyAccess
Policies:
- PolicyName: accesskey-fullaccess
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "iam:DeleteAccessKey"
- "iam:GetAccessKeyLastUsed"
- "iam:UpdateAccessKey"
- "iam:CreateAccessKey"
- "iam:ListAccessKeys"
Resource: "arn:aws:iam::「IAMユーザ用アカウントのID」:user/${aws:username}"
</pre><div><br /></div><div>「IAMユーザ用アカウント」の、このロールにはアクセスキーを作成する権限を与えます。</div><div><br /></div><h3 style="text-align: left;">IAMグループ作成</h3><div><br /></div><div>IAMユーザ用のグループを作成します。</div><div>グループに設定するポリシーでは、「パスワード変更」、「MFA設定」、「スイッチロール」ができるだけの最小限の権限を与えます。</div><div><br /></div><div>CloudFromationテンプレートのサンプルは下記のとおり。</div><div><div><pre class="prettyprint linenums"> DevGroupPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
ManagedPolicyName: Blue21DemoDevUser
Groups:
- !Ref DevGroup
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: "VisualEditor0"
Effect: "Allow"
Action:
- "iam:ChangePassword"
Resource: "arn:aws:iam::*:user/${aws:username}"
- Sid: "VisualEditor1"
Effect: "Allow"
Action:
- "iam:GenerateCredentialReport"
- "iam:Get*"
- "iam:List*"
- "iam:SimulatePrincipalPolicy"
- "iam:SimulateCustomPolicy"
- "iam:GenerateServiceLastAccessedDetails"
Resource: "*"
- Sid: "VisualEditor2"
Effect: "Allow"
Action:
- "iam:DeactivateMFADevice"
- "iam:EnableMFADevice"
- "iam:ResyncMFADevice"
- "iam:ListMFADevices"
Resource: "arn:aws:iam::*:user/${aws:username}"
- Sid: "VisualEditor3"
Effect: "Allow"
Action:
- "iam:DeleteVirtualMFADevice"
- "iam:CreateVirtualMFADevice"
Resource: "arn:aws:iam::*:mfa/${aws:username}"
- Sid: "VisualEditor4"
Effect: "Allow"
Action:
- "sts:AssumeRole"
Resource: "arn:aws:iam::*:role/Blue21DemoDevRole"
Condition:
BoolIfExists:
aws:MultiFactorAuthPresent: "true"</pre><pre class="prettyprint linenums"> DevGroup:
Type: AWS::IAM::Group
Properties:
GroupName: Blue21DemoGroupDev
Path: /
</pre></div><div><br /></div></div><h3 style="text-align: left;">IAMユーザ作成</h3><div><br /></div><div>IAMユーザを登録します。</div><div>aws-cli だと下記のとおり。<br />このユーザには、AWSコンソールのログインを許可します。</div><pre class="term">$ aws iam create-user --user-name user-dev01
$ aws iam create-login-profile --user-name user-dev01 --password P@ss20210627 --password-reset-required
$ aws iam add-user-to-group --user-name user-dev01 --group-name Blue21DemoGroupDev</pre><div><br /></div><h2 style="text-align: left;">開発用アカウントでの作業</h2><div><div><br /></div><div>作成するもの</div><div><ul><li>IAMロール(スイッチ用)</li></ul></div></div><div><br /></div><div><h3>IAMロール作成</h3><div><br /></div><div>スイッチ用のロールを作ります。</div>「IAMユーザ用アカウント」のユーザが、このロールにスイッチして「開発用アカウント」で作業するようにします。<div><div><br /></div><div>CloudFromationテンプレートのサンプルは下記のとおり。</div><div>前述の「IAM用アカウント」で作成したロールとの違いは、「アクセスキー」を操作する権限がないことだけです。</div>パラメータの${AccountId} の部分には、「IAMユーザ用アカウント」のAWSアカウントIDを指定します。<div><div>ConditionでスイッチするIAMユーザ名の有無をチェックしています。</div><div><pre class="prettyprint linenums"> SwitchRoleDev:
Type: AWS::IAM::Role
Properties:
RoleName: Blue21DemoDevRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS:
- !Sub arn:aws:iam::${AccountId}:root
Action:
- 'sts:AssumeRole'
Condition:
StringLike:
sts:RoleSessionName: ${aws:username}
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonS3FullAccess
- arn:aws:iam::aws:policy/AmazonEC2FullAccess</pre><div><br /></div></div></div></div></div><h2 style="text-align: left;">AWSコンソールで確認</h2><div><br /></div><div>AWSコンソールで「IAMユーザ用アカウント」にログインすると、初回のみパスワード変更を要求されます。</div><div>試しに、MFAを設定せずに、スイッチロールしてみるとエラーになりましました。</div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiDhHJhvdV3d2b1rEiCrUmy-pf5Axj6Q1s8csXz4MvB7xNfNEJKhRq_atvoYSjylz-gZNRu-LQl3MEA1ousNnCsoo1x0DqnqHVTpv3-bujG_w5VnhuzPbZF_RLUAKbFV_vsosgikyWl-Tj/s1465/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="697" data-original-width="1465" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiDhHJhvdV3d2b1rEiCrUmy-pf5Axj6Q1s8csXz4MvB7xNfNEJKhRq_atvoYSjylz-gZNRu-LQl3MEA1ousNnCsoo1x0DqnqHVTpv3-bujG_w5VnhuzPbZF_RLUAKbFV_vsosgikyWl-Tj/w400-h190/001.png" width="400" /></a></div><div><br /></div>MFAを設定して、ログインし直すと、スイッチロールできます。</div><div>スイッチロールすれば、Blue21DemoDevRoleの権限で作業できます。</div><div>下図の左が「ログインしたアカウントの情報」、右が「スイッチした先のアカウントの情報」になります。</div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEj1BFWZtcP4r7YwSbgzyR10-xjzwFGOuQWalbJV2_k_h6bthRMWo9DK0sn7muj6z_IHfxtc5pVAydTjT8CSCHYA3cFt1tv3ZF8Cvxn7SIw-d4wI3D6fy7t1pO16YYL34COOJ2Hgxb7J6Y/s734/002.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="652" data-original-width="734" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEj1BFWZtcP4r7YwSbgzyR10-xjzwFGOuQWalbJV2_k_h6bthRMWo9DK0sn7muj6z_IHfxtc5pVAydTjT8CSCHYA3cFt1tv3ZF8Cvxn7SIw-d4wI3D6fy7t1pO16YYL34COOJ2Hgxb7J6Y/s320/002.png" width="320" /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">「IAMユーザ用アカウント」から「開発用アカウント」へもスイッチできます。</div><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifn0ocLyiZnCAvVLwRHABTbp7HO5cX3mY79QAVLk0sR0LFwJMBiKCZIQkjogWxfFdUjFE9wTn5LYW2-QBmcpfRp7AeRxdin7An8Qm9dBz-wIQxJvSgQ0NIXGbFssoUTd9m972sc07ZJOu0/s744/002.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="642" data-original-width="744" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifn0ocLyiZnCAvVLwRHABTbp7HO5cX3mY79QAVLk0sR0LFwJMBiKCZIQkjogWxfFdUjFE9wTn5LYW2-QBmcpfRp7AeRxdin7An8Qm9dBz-wIQxJvSgQ0NIXGbFssoUTd9m972sc07ZJOu0/s320/002.png" width="320" /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">なお、このユーザが所属するグループは、Blue21DemoDevRoleへのスイッチしか許可していないので、他のロールにスイッチしようとするとエラーになります。</div><div style="text-align: left;"><br /></div><div>MFAの設定は下記ページ参照。<br />ChromeでGoogle Authenticator使うと便利です。</div><ul><li><a href="https://qiita.com/viptakechan/items/6d19aee635b2ab189e47" target="_blank">AWSでMFA(二段階認証)を有効にする方法を超丁寧に説明するよ</a></li><li><a href="https://zenn.dev/rsk_for_dev/articles/7684ac3f6c7004" target="_blank">【AWS入門②】IAMユーザーと仮想 MFA デバイスの設定</a></li></ul><div><div><br /></div><div>Chromeで複数アカウントを使い分けたいときは、下記ページ参照</div><ul style="text-align: left;"><li><a href="https://dev.classmethod.jp/articles/google-chrome-multi-aws-account/" target="_blank">Google Chromeで複数AWSアカウントでの作業を快適に行う方法</a></li></ul><div><br /></div><div>Chromeからスイッチロールの履歴を削除したい場合は、下記ページ参照</div><ul style="text-align: left;"><li><a href="https://dev.classmethod.jp/articles/delete-my-assumerole-history-of-amc/" target="_blank">AWSマネジメントコンソールのロール履歴を削除したい</a></li></ul><div><br /></div><div>Chromeでスイッチロールを便利に使う方法は、下記ページ参照</div><ul style="text-align: left;"><li><a href="https://cloudpack.media/55842" target="_blank">スイッチロールを管理する「AWS Extend Switch Roles」</a></li></ul><div><br /></div><h2 style="text-align: left;">aws-cli で確認</h2><div><br /></div><div>まず、アクセスキーを作ります。</div><div><br /></div><div>AWSコンソールで「IAMユーザ用アカウント」にログインします。</div><div>ログインしただけではアクセスキーを作成する権限がないので、Blue21DemoDevRoleにスイッチして、アクセスキーを作成します。</div><div><br /></div><div>次に、aws-cli の設定をします。</div><div><br /></div><div>~/.aws/config の設定は下記のとおり。</div><div>blue21-iam が「IAMユーザアカウント」用</div><div><br /></div><div><pre class="prettyprint linenums">[profile blue21-iam]
region = us-east-1
output = json
[profile blue21-dev]
region = us-east-1
output = json
role_arn = arn:aws:iam::「IAMユーザ用アカウントのID」:role/Blue21DemoDevRole
mfa_serial = arn:aws:iam::「IAMユーザ用アカウントのID」:mfa/user-dev01
role_session_name = user-dev01
source_profile = blue21-iam
[profile sandbox-dev]
region = us-east-1
output = json
role_arn = arn:aws:iam::「開発ユーザ用アカウントのID」:role/Blue21DemoDevRole
mfa_serial = arn:aws:iam::「IAMユーザ用アカウントのID」:mfa/user-dev01
role_session_name = user-dev01
source_profile = blue21-iam</pre></div><div><br /></div><div>~/.aws/credentiales は下記のとおり。<br /><div><pre class="prettyprint linenums">[blue21-iam]
aws_access_key_id = 「アクセスキー」
aws_secret_access_key = 「シークレットアクセスキー」</pre></div><div><br /></div></div><div>「IAM用アカウント」で作業したい場合は、下記のように実行します。<br /></div><div>MFAの認証コードを聞かれるので、認証コードを入力すると実行できます。</div><div><pre class="term">$ aws s3 ls --profile blue21-dev
Enter MFA code for arn:aws:iam::123456789012:mfa/user-dev01:</pre></div><div><br /></div><div><div>「開発用アカウント」で作業したい場合は、下記のように実行します。<br /></div><div>MFAの認証コードを聞かれるので、認証コードを入力すると実行できます。</div><div><pre class="term">$ aws s3 ls --profile sandbox-dev
Enter MFA code for arn:aws:iam::345678901234:mfa/user-dev01:</pre></div><div><br /></div></div><div>aws-cliでMFAする場合は、aws-mfaを使うと便利です。<br />下記ページ参照</div><ul style="text-align: left;"><li><a href="https://qiita.com/ogady/items/c17ffe8f7c8e15b15f77" target="_blank">AWS CLIからのMFA(多要素認証)を楽にするツール(aws-mfa)を使ってみた</a></li></ul><div><br /></div><div><br /></div><div><br /></div><div><br /></div></div></div></div>Unknownnoreply@blogger.comtag:blogger.com,1999:blog-286254559373804388.post-34437751023382963522021-06-15T21:11:00.002+09:002021-06-25T20:48:48.088+09:00emacs の neotree の色を変える<p><br /></p><p>emacs に neotree をいれてみました。 </p><p>環境は以下のとおり。</p><p></p><ul style="text-align: left;"><li>Windows10 + WSL2</li><li>ubuntu20.04</li><li>emacs 26.3</li></ul><p></p><p><br /></p><p>init.el の設定は以下のとおり。</p><pre class="term">(require 'neotree)
(setq neo-theme 'acsii)
(setq neo-persist-show t)
(setq neo-smart-open t)
(global-set-key "\C-o" 'neotree-toggle)</pre><p><br /></p><p>これで、Ctlキー+oキーでディレクトリ一覧が表示されます。</p><p>下図はWindowsターミナルの表示例ですが、ファイル名の表示色が黒なので背景に同化して見えません。(赤枠の部分)</p><p><br /></p><div style="text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVT1NG0KDqBva7mYDbqToXRdlKP5HUhDI0dVsVkf3tlM1mU3z18l9LXI7SuNdbmd2E9OOdGfA7wRTcLuGZLqUzgwJv_EuDG6DcAFoXxVG2Dp-96BhF6sjeHPqX_GgNeci7bMqry_ZMqRV9/s1426/001.png" style="clear: left; margin-bottom: 1em;"><img border="0" data-original-height="805" data-original-width="1426" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVT1NG0KDqBva7mYDbqToXRdlKP5HUhDI0dVsVkf3tlM1mU3z18l9LXI7SuNdbmd2E9OOdGfA7wRTcLuGZLqUzgwJv_EuDG6DcAFoXxVG2Dp-96BhF6sjeHPqX_GgNeci7bMqry_ZMqRV9/w400-h226/001.png" width="400" /></a></div><br /><p>neotreeの色を変えてみます。</p><p>init.el に custom-set-fasesの設定を追加します。</p><pre class="term">(require 'neotree)
(setq neo-theme 'acsii)
(setq neo-persist-show t)
(setq neo-smart-open t)
(global-set-key "\C-o" 'neotree-toggle)
(custom-set-faces
'(neo-root-dir-face ((t (:foreground "#8D8D84"))))
'(neo-dir-link-face ((t (:foreground "#0000FF"))))
'(neo-file-link-face ((t (:foreground "#BA36A5")))))
</pre><p><br /></p><p>下図のようにファイル名が見えるようになりました。</p><p><br /></p><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzTxuumMFvifTmAFAXQg6OvDQp13NsOyKk5VPE0am_-uKxDiXvCCD0B16B_UNViBGqMQQETMVEkeTASyEdwb0KfpDhB10fzExjMS-_4W2Qcq9uUFjir9_oUsUp1OMKtttGlmjwxgVRnEzY/s1429/002.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="812" data-original-width="1429" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzTxuumMFvifTmAFAXQg6OvDQp13NsOyKk5VPE0am_-uKxDiXvCCD0B16B_UNViBGqMQQETMVEkeTASyEdwb0KfpDhB10fzExjMS-_4W2Qcq9uUFjir9_oUsUp1OMKtttGlmjwxgVRnEzY/w400-h228/002.png" width="400" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Unknownnoreply@blogger.com