ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

sam deploy で 謎のエラー : I/O stream type expected

sam deploy すると I/O stream type expected というエラーが出てハマりました。

環境

% sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.7
BuildVersion:   19H2

% aws --version
aws-cli/2.0.28 Python/3.7.4 Darwin/19.6.0 botocore/2.0.0dev32

% brew --version
Homebrew 3.2.6
Homebrew/homebrew-core (git revision c0d11ed420; last commit 2021-08-16)
Homebrew/homebrew-cask (git revision d2af1d09dc; last commit 2021-08-16)

% sam --version
SAM CLI, version 1.27.2

% anyenv --version
anyenv 1.1.1

% pyenv --version
pyenv 1.2.21

経緯

下記の内容で sam init した。

    -----------------------
    Generating application:
    -----------------------
    Name: sam-app
    Runtime: python3.8
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .

その後、

% sam build
% sam deploy --guided

をして、下記以外はデフォルトのままデプロイしようとした、

HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y

すると怒られた。I/O stream type expected のエラーについて調べてもあまり有力な情報は出てこなかった。

Error: Unable to upload artifact HelloWorldFunction referenced by CodeUri parameter of HelloWorldFunction resource.
I/O stream type expected

解決

エラーメッセージを見てみると、/usr/local/lib/python3.8/site-packages/awscrt にてエラーが起きているらしい。

Python 自体は anyenv の pyenv 経由で 3.8 系を設定してある。 ここで、pip list してみる。

% pip list
Package    Version
---------- -------
pip        20.1.1
setuptools 47.1.0

おかしい。何もインストールしてないよ。 pip show してみる。

% pip show pip
...
Location: /Users/<USER_NAME>/.anyenv/envs/pyenv/versions/3.8.5/lib/python3.8/site-packages
Requires: 
Required-by: 

ここで記載されているディレクトリとは関係ない /usr/local/... のファイルを読みに行っておかしくなってるっぽい。

ということで、なぜか読みに行ってしまうディレクトリをテキトーにリネームする。

% mv /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages2

これで sam deploy したら上手くデプロイできた。

anyenv の pyenv 以外で入れた Python の環境でインストールしたライブラリが邪魔をしていたというのが結論で良いのかしら。

とりあえず動くようになってよかった。