不具合の発生
オンプレミスのLinuxからS3互換ストレージへアップロードするときに、時々失敗するようになり、下記のエラーが発生していた。
SSL validation failed for https://s3.ap-northeast-1.wasabisys.com/ EOF occurred in violation of protocol (_ssl.c:2406)
awscliv2は不具合が多い。それなのに情報が殆ど流れていない。ChatGPTの解決策をアテにしてもハマる。
マジメに対応すると骨が折れたのでブログに残す事にした。
まず結論から(解決方法)
・awscli v2で発生する該当エラーには回避策はない(システム依存)
・awcsli v1(pipでインストールできるawscli)を使うと回避できた
・もしくは、互換のawscli相当のツールを使う
暫定対応でawscliv2のまま動く可能性がある方法
awscliv2で正常に動作させるための方法を調査したところ、
"--no-verify-ssl"
というオプションでSSL検証を無効化すると動く(推奨しない)という情報があり、具体的なコマンドだと以下のように s3へのコピーでテストした。
aws s3 cp srcfile s3://dstbucket/srcfile --no-verify-ssl
SSL検証無効化で実行するとwarningが発生するがアップロードが完了するようになった。
これで解決・・とはならず、翌日には"SSL validation failed"が再発することになり次の課題に続く。
翌日に"SSL validation failed"再発
翌日にログを確認すると"--no-verify-ssl"を指定したcronタスクが失敗している事が発覚した。
前日はコピーが完了していたのに、なぜ翌日に失敗したのか。調査しても分からなかったので引き続き対策を検討する。
不具合について調査・対策した内容
- TLS バージョンの問題
- サーバークライアントのTLSバージョンが異なる場合に「EOF occurred in violation of protocol」が発生する可能性がある
- OpenSSL / urllib3 / boto3 の互換性問題
- TLS ハンドシェイクが失敗することがある
- ca-certificates の問題
- 証明書チェーン (ca-certificates) が正しく認識されていないと、TLS 接続の確立に失敗することがある
- "--endpoint-url" オプションの問題
- S3互換ストレージと通信する際に互換性の問題が生じる場合がある
全て調査して対策したが、awscliv2では解決せず。
ChatGPTからawscliの代替ツールを聞き出す
代替のCLIツールとしては以下の候補が挙げられた。
s3cmd, s5cmd, mc(MinIO Client), rclone, boto3
ここで気付いたのがawscli v1で動くかどうか確認したところ、問題なく動作した。
結論としてaws s3コマンドでS3へのファイルコピーでSSLエラーが発生した場合はawscli v1を使えば解決する。
pip install awscli
awscli v1の欠点としては「サポート終了」のツールなので、自己責任で使う必要がある点だろう。
S3互換ストレージに対応したCLIツール一覧表
S3互換ストレージに対応した CLI ツールについて、特徴や長所・短所を比較した一覧表を作成した。
ツール名 | 言語 | 特徴 | 長所 | 短所 |
---|---|---|---|---|
awscli v1 | Python | AWS 公式 CLI の旧バージョン | ✅ boto3 ベースで安定動作 ✅ aws s3 sync が利用可能 ✅ S3 互換ストレージとの相性が良かった |
❌ 既にサポート終了 ❌ TLS 1.2 以上が必須の環境では動作しない可能性あり |
awscli v2 | Rust/Python | AWS 公式 CLI の最新バージョン | ✅ aws s3 sync を含むフル機能 ✅ Rust ベースでパフォーマンス向上 ✅ 最新の AWS 認証方式に対応 |
❌ Wasabi などの S3 互換ストレージで SSL/TLS 関連の不具合が多発 ❌ urllib3 との相性問題あり |
s3cmd | Python | 古くからある S3 互換ツール。 AWS, Wasabi 公式サポート |
✅ boto3 ベースで Python との相性が良い ✅ sync が aws s3 sync とほぼ同等 ✅ 設定ファイルを使った認証管理 |
❌ aws s3 cp より低速 ❌ マルチスレッド非対応 ❌ GUI なし |
s5cmd | Go | 高速で軽量な S3 CLI。並列処理に対応 | ✅ aws s3 sync より圧倒的に高速 ✅ Go 製で単一バイナリ、依存関係なし ✅ 並列アップロード・ダウンロードが可能 |
❌ 認証設定がやや手間(環境変数 or 設定ファイル) ❌ boto3 との互換性が低い |
mc | Go | MinIO 公式の S3 互換 CLI。 MinIO, Wasabi, AWS 対応 |
✅ mc mirror が aws s3 sync 相当 ✅ シンプルな CLI で使いやすい ✅ mc alias による簡単な認証管理 |
❌ awscli や boto3 との互換性が低い ❌ Go 製のため、Python 連携は考慮されていない |
boto3 | Python | Python で S3 操作を行う公式ライブラリ | ✅ awscli 相当の機能をスクリプト化できる ✅ 認証情報を AWS プロファイルや環境変数で管理可能 ✅ 公式の AWS SDK なので安心 |
❌ CLI ツールではなく、スクリプトを書く必要がある ❌ コマンド1つで簡単に使えない |
rclone | Go | 多種クラウド対応のファイル同期ツール | ✅ rclone sync で aws s3 sync 相当の操作可能 ✅ GUI ( rclone browser ) あり ✅ S3 以外の Google Drive, Dropbox, OneDrive なども対応 |
❌ boto3 を使わない ❌ 設定ファイルを事前に用意する必要がある |
awscliv2の注意点
- そもそもawscliv2にはバグが多い
- バグが多いので頻繁にアップデートされる
- パッケージマネージャがないのでストレージが大量消費される
awscli2は定期的に最新版を取得しているとストレージ消費がエグイので、
手前みそながら最新版だけを残して古いバージョンを削除して最新版だけを残すbashスクリプトを公開している。
S3以外の用途では、awscliv2が必須になる用途が多々あるため、
awscliv2の「aws」コマンドを「aws2」等にmvして運用させるのが妥当だと思う。