🍣
Matsuri-tech Backend Weekly 2023-08-01

myuon

myuon

2023年8月1日
MBW

社内向けに、バックエンド関連のニュースや業務で発生したQ&A、利用しているライブラリなどの情報を定期的に書いています。

# Troubleshooting: awscli を使用する Docker イメージのビルドが通らなくなった

7 月 18 日、awscli を使っていた Docker イメージのビルドができなくなりました。 CI 上で docker build のコマンドが失敗しており、次のようなエラーを吐いていました。

使っているのは alpine ベースのイメージです。

=> ERROR [3/7] RUN pip install awscli                                     7.1s
------
 > [3/7] RUN pip install awscli:
0.587 Collecting awscli
1.767   Downloading https://files.pythonhosted.org/packages/aa/24/e098cf5ce28a764bca174e88f4ccb70754e9f049c9bf986e582aedcb7420/awscli-1.19.112-py2.py3-none-any.whl (3.6MB)
2.208 Collecting botocore==1.20.112 (from awscli)
3.350   Downloading https://files.pythonhosted.org/packages/c7/ea/11c3beca131920f552602b98d7ba9fc5b46bee6a59cbd48a95a85cbb8f41/botocore-1.20.112-py2.py3-none-any.whl (7.7MB)
3.726 Collecting s3transfer<0.5.0,>=0.4.0 (from awscli)
3.758   Downloading https://files.pythonhosted.org/packages/63/d0/693477c688348654ddc21dcdce0817653a294aa43f41771084c25e7ff9c7/s3transfer-0.4.2-py2.py3-none-any.whl (79kB)
3.779 Collecting colorama<0.4.4,>=0.2.5 (from awscli)
3.822   Downloading https://files.pythonhosted.org/packages/c9/dc/45cdef1b4d119eb96316b3117e6d5708a08029992b2fee2c143c7a0a5cc5/colorama-0.4.3-py2.py3-none-any.whl
3.840 Collecting PyYAML<5.5,>=3.10 (from awscli)
3.958   Downloading https://files.pythonhosted.org/packages/a0/a4/d63f2d7597e1a4b55aa3b4d6c5b029991d3b824b5bd331af8d4ab1ed687d/PyYAML-5.4.1.tar.gz (175kB)
4.099   Installing build dependencies: started
6.633   Installing build dependencies: finished with status 'done'
6.844     Complete output from command python setup.py egg_info:
6.845     running egg_info
6.845     creating pip-egg-info/PyYAML.egg-info
6.845     writing pip-egg-info/PyYAML.egg-info/PKG-INFO
6.845     writing top-level names to pip-egg-info/PyYAML.egg-info/top_level.txt
6.845     writing dependency_links to pip-egg-info/PyYAML.egg-info/dependency_links.txt
6.845     writing manifest file 'pip-egg-info/PyYAML.egg-info/SOURCES.txt'
6.845     Traceback (most recent call last):
6.845       File "<string>", line 1, in <module>
6.845       File "/tmp/pip-install-_6xj4P/PyYAML/setup.py", line 295, in <module>
6.845         python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*',
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/__init__.py", line 162, in setup
6.845         return distutils.core.setup(**attrs)
6.845       File "/usr/lib/python2.7/distutils/core.py", line 151, in setup
6.845         dist.run_commands()
6.845       File "/usr/lib/python2.7/distutils/dist.py", line 953, in run_commands
6.845         self.run_command(cmd)
6.845       File "/usr/lib/python2.7/distutils/dist.py", line 972, in run_command
6.845         cmd_obj.run()
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/command/egg_info.py", line 296, in run
6.845         self.find_sources()
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/command/egg_info.py", line 303, in find_sources
6.845         mm.run()
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/command/egg_info.py", line 534, in run
6.845         self.add_defaults()
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/command/egg_info.py", line 570, in add_defaults
6.845         sdist.add_defaults(self)
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/command/py36compat.py", line 36, in add_defaults
6.845         self._add_defaults_ext()
6.845       File "/tmp/pip-build-env-qn308Z/lib/python2.7/site-packages/setuptools/command/py36compat.py", line 120, in _add_defaults_ext
6.845         self.filelist.extend(build_ext.get_source_files())
6.845       File "/tmp/pip-install-_6xj4P/PyYAML/setup.py", line 201, in get_source_files
6.845         self.cython_sources(ext.sources, ext)
6.845       File "/usr/lib/python2.7/distutils/cmd.py", line 105, in __getattr__
6.845         raise AttributeError, attr
6.845     AttributeError: cython_sources
6.845
6.845     ----------------------------------------
6.989 Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-_6xj4P/PyYAML/
------
ERROR: failed to solve: executor failed running [/bin/sh -c pip install awscli]: exit code: 1

内容としては pip install で awscli が入らなくなったことで、よくみると PyYAML のあたりでコケているのが確認できます。

対応については、aws-cli の issue の次のコメントが参考になりました。

要約すると、

  • aws-cli の v2 に上げるのがおすすめ
  • それが難しい場合には、--no-build-isolation オプションをつけるといいよ
  • PyYAML のバージョンを下げると別の CVE に引っかかるので推奨はしない

とのことでした。

実際に試してみたところ、--no-build-isolation オプションをつけると無事にインストールできてうまく動きました。

あまり詳細を調べていないため具体的に PyYAML で何が起こっていたかまでは把握していませんが、ひとまずオプションをつけることで回避できることと、可能であれば aws-cli v2 にあげた方が良さそうです。

# Go 1.21 がもうすぐ出ます。リリースノートが公開されています。

https://tip.golang.org/doc/go1.21

少し気が早いですが、今月のリリースが予定されている Go1.21 のリリースノートが出ているのでみてみましょう。 リリースが多いので全てを見ることはできませんが、気になったものをピックアップしてみました。

# min, max の追加

https://tip.golang.org/ref/spec#Min_and_max

組み込み関数 min と max が追加されました。 弊社プロダクトでも maxOfInts などが独自に定義されているコードを見かけたことがあるので組み込まれるのは嬉しいですね。

string に対してなども使えます。

# log/slog パッケージの追加

https://pkg.go.dev/log/slog

slog パッケージが追加されました。 zap などをはじめとする構造化ロギングの流れを汲んだものと言えそうです。

すでに使っているロガーがあれば無理に移行する必要があるようなものではないと思いますが、標準ライブラリの範囲で JSON 形式のログを吐いたりできるのは便利そうです。

# slices, maps パッケージの追加

https://pkg.go.dev/slices

https://pkg.go.dev/maps

slice や map に関する便利なメソッドを提供する slices, maps パッケージが追加されます。 ここには今までの Go に足りないと言われていたメソッドが多く含まれているので、いよいよジェネリクスの本領発揮と言えるかもしれません。

いくつか、使う機会の多そうなものをピックアップしてみます。

  • maps.Keys, maps.Values: key や value を slice で返す
  • slices.Compact: 連続する同じ値を削除する ← これは for 文でサッと実装するのは結構面倒なのでありがたい
  • slices.Index: 要素を slice から探して index を返す
  • slices.Sort: ソートする(破壊的)
  • slices.Equal: 2 つの slice が等しいかどうかを返す

# ループ変数がループごとに変数を共有しなくなる LoopvarExperiment の試験的導入

実際の導入は Go1.22 になるようで、Go1.21 の段階では GOEXPERIMENT=loopvars をつけてビルドすることで有効にできます。

以前からよく言われている Go の注意が必要な仕様の一つを改善しようという動きです。for 文でループ変数をループごとに共有しなくなるので、ループ変数の参照をとって後から参照するコードがバグらなくなりますし、 index := index のような一件謎のコードも今後は減らせそうです。

個人的にはかなり厄介な仕様だと感じていたので、修正されるのは嬉しい限りです。