社内向けに、バックエンド関連のニュースや業務で発生したQ&A、利用しているライブラリなどの情報を定期的に書いています。
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 の次のコメントが参考になりました。
要約すると、
--no-build-isolation
オプションをつけるといいよとのことでした。
実際に試してみたところ、--no-build-isolation
オプションをつけると無事にインストールできてうまく動きました。
あまり詳細を調べていないため具体的に PyYAML で何が起こっていたかまでは把握していませんが、ひとまずオプションをつけることで回避できることと、可能であれば aws-cli v2 にあげた方が良さそうです。
https://tip.golang.org/doc/go1.21
少し気が早いですが、今月のリリースが予定されている Go1.21 のリリースノートが出ているのでみてみましょう。 リリースが多いので全てを見ることはできませんが、気になったものをピックアップしてみました。
https://tip.golang.org/ref/spec#Min_and_max
組み込み関数 min と max が追加されました。 弊社プロダクトでも maxOfInts などが独自に定義されているコードを見かけたことがあるので組み込まれるのは嬉しいですね。
string に対してなども使えます。
slog パッケージが追加されました。 zap などをはじめとする構造化ロギングの流れを汲んだものと言えそうです。
すでに使っているロガーがあれば無理に移行する必要があるようなものではないと思いますが、標準ライブラリの範囲で JSON 形式のログを吐いたりできるのは便利そうです。
slice や map に関する便利なメソッドを提供する slices, maps パッケージが追加されます。 ここには今までの Go に足りないと言われていたメソッドが多く含まれているので、いよいよジェネリクスの本領発揮と言えるかもしれません。
いくつか、使う機会の多そうなものをピックアップしてみます。
実際の導入は Go1.22 になるようで、Go1.21 の段階では GOEXPERIMENT=loopvars
をつけてビルドすることで有効にできます。
以前からよく言われている Go の注意が必要な仕様の一つを改善しようという動きです。for 文でループ変数をループごとに共有しなくなるので、ループ変数の参照をとって後から参照するコードがバグらなくなりますし、 index := index
のような一件謎のコードも今後は減らせそうです。
個人的にはかなり厄介な仕様だと感じていたので、修正されるのは嬉しい限りです。