エンジニャーリング

技術ときどきネコ

pythonのエラーハンドリング

pythonでエラーが起こった時にどう対処するか?
pythonのエラーハンドリングについての世の中の知見を見て回った。

大きくは2系統。
エラー判定してreturnするタイプと例外を投げてキャッチするケースとあるらしい。
他の言語と一緒ってことで考えて良さげかな。

実際のところどちらが良いかなんて、システムの方向性とか設計思想によるのでどちらが良い!とは言えないですが、 何も考えなければ、例外を投げてキャッチする方が使い勝手が良さそうだったので、例外の方を採用。
あとは、呼び出し元まで投げてあげれば大体は丸く収まるので、戻り値を戻るたびに判定しないといけないreturnの場合よりも楽な気がする。

ときに、pythonでは例外を投げるときに 「raise」を使って投げるのだが、復活って意味かと思ってたら(FFのせい)、上げるって割と普通の意味だった。例外=死からの復活(raise)だと思ってコード書いたのになんか意味違ってガッカリ。

セッションマネージャーが意外と使えた

EC2への接続はSSHで接続してましたが、セッションマネージャーを使えばIAMベース簡単に接続できた。

セッションマネージャーの利点

  • IAMで管理可能
  • 22番ポートを開けなくて良い
  • privateなEC2インスタンスにも接続可能
  • 踏み台がいらないんじゃない?
    • これはDBインスタンスへの接続する場合は踏み台が必要でした
    • その時もセッションマネージャーを通しての踏み台が可能

IAM1本で管理できるようになるので、SGで22番ポートにIPアドレス制限かけたりとかも気にしなくて良く、セキュリティ的にも安心。
これはやらない手はない。それではやってみよう。

AWS CLIのインストール・設定からEC2へ接続をするまで

AWS CLI v2のインストール

接続にはAWS CLIが必要となるので、ドキュメントの通りインストールを行います。なお、今回は最新のAWS CLI v2をインストールします。

curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
which aws
  • /usr/local/bin/aws であればOK
aws --version
  • aws-cli/2.X.XX であればOK

Session Manager plugin のインストール

cd /tmp
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
session-manager-plugin
  • The Session Manager plugin was installed successfully. Use the AWS CLI to start a session. のように表示されればOK

aws configure でIAMユーザの設定情報をセット

$ aws configure
AWS Access Key ID [None]: AKIXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: KO8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

ここまでで設定は完了

EC2接続確認

EC2インスタンスインスタンスID(i-XXXXXXXXXXXXXXXXX)を指定して接続する

aws ssm start-session --target i-XXXXXXXXXXXXXXXXX

ssmユーザーでログインします。(ススムくんと命名
このままだと、bashrcが読まれないので気になるようだったら自分で読み込む必要がある。

Starting session with SessionId: XXXXXXXXXX

sh-4.2$ source ~/.bashrc
[ssm-user@ip-xx-xx-xx-xx bin]$ cd
[ssm-user@ip-xx-xx-xx-xx  ~]$ 

これでec2-userで繋いだ時と同様な使い方ができるようになった。

2021/08/11 追記
これを使用するためには、EC2側にあらかじめSSM Agentのインストールが必要ですが、AmazonLinux2にはデフォルトでインストールされてるとのこと。
また、[AmazonSSMManagedInstanceCore]がアタッチされたiam roleを対象のEC2heアタッチする必要があります。

pythonの正解って?

最近Python書いてみてます。
良い感じで自由。でもルールづけしないと統一性が保てなさそう。
型をきちんと定義しないのはCとかJavaやってた頃と違うなぁと思う。
多少の気持ち悪さはあってもなんとなくで書けちゃう。

け ど ね !

正しく書けてない気がする。
dict型の使い方とかエラーハンドリングとか...

こういうことって、誰かの洗練されたコードを見て学ぶべき!
ってことで、GitHubに落ちてるコードを読んでみると、なんか自由で本来見たいところに目が行かなかった。

例えば、変数の命名規則が、スネークケースだったり、キャメルケースだったり。
変数名はスネークで、クラス名はパスカルで、メソッド名はキャメルが正解だと思ってたんですが、違うんでしょうか。
しばらく調査は続きそう。

技術者がすなるといふ技術ブログといふものをしてみんとてするなり

はじめてみました。

つい1ヶ月前にやったことをさっぱり忘れてしまうという今日この頃。 人間忘れないと新しいことが入ってこないのです。その点ではなんだかPCと似てますね。

数ヶ月の自分のため、同じことで悩む仲間のためになんとかなればいいな。