なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

クロスアカウントS3の設定

クロスアカウントとは

AWSのアカウントが別個に存在するということ。セキュリティ的に分けている方針もあれば、そもそも使用している会社組織が異なるために別のアカウントになっていることもあるでしょう。今回はこれでだいぶハマりました。

クロスアカウントでのS3使用のユースケース

登場人物の整理
  • アカウントA, Bが存在する
  • アカウントAにはbucketAが存在する
  • アカウントBにはbucketBが存在する
  • アカウントBのS3にアクセスできるユーザとそのキーが発行されている
やりたいこと
  1. アカウントBのキーでbucketBからファイルダウンロード
  2. ファイルをbucketAへアップロード

問題

  • ファイルをbucketAへアップロードできない

解決策

ここが参考になりました

  • アカウントAにbucketA操作用のロールAを作る
  • アカウントB側でそれをAssumeRoleできる設定にする
  • ファイルをbucketAへアップロード にする際にAssumeRoleして実行

AssumeRoleはaws cliでテストすることができます。

[base-profile]
aws_access_key_id = xxx
aws_secret_access_key = yyy

[role-for-assume-profile]
role_arn = arn:aws:iam::111111111111:role/role-for-assume
source_profile = base-profile
aws_access_key_id = xxx
aws_secret_access_key = yyy

AWS LambdaでLayer機能を使う

Layers

AWSのドキュメント AWS Lambda レイヤー - AWS Lambda

AWSのLayersを使うと、Pythonの依存ライブラリなどを設定し共通ライブラリとして使える。(AWS Lambdaのソースコード容量制限は厳しいので、これを使うのが正しいだろう)

AWS Lambdaのデプロイパッケージサイズ上限は

  • 50 MB (圧縮)
  • 250 MB (解凍、例: レイヤー)
  • 3 MB (コンソールエディタ)

参考にしたサイト

もともとpandasを使いたかったので助かった。 注意点としてはpipで依存ライブラリを保存するディレクトリが'python'で始めないといけない点だろう。

デプロイ自動化

  • 開発を進めるとrequirements.txtのライブラリが追加されると思います
  • これがあるたびに手動でzip化を行うのは非効率
  • なのでEC2上のJankinsで pip install -r requiements.txt → zip化 → boto3でpublish のようなことをやっています

Layer用のzipファイルを作る際には標準ライブラリのshutilを使うと楽だった。python - How to create a zip archive of a directory - Stack Overflow

$ pip install -r requiements.txt -t ./python

のようにpythonディレクトリ以下にライブラリを出力して、それを包含するzipファイルをshutilでやればOK。

PySparkの実行でImportError: No module namedが出たとき

ImportError: No module named

エラー

EMRの実環境でPySparkでクエリやUDFを実行させていたら以下のようなエラーが発生した。

ImportError: No module named 'foo'

どうやら各ノードにPythonのモジュールが分散されていない(?)ようだ。

対処

StackOverflowに似たようなケースがあった
stackoverflow.com

どうやら spark-submit コマンドの後に --py-files のような引数を追加すればいいらしい。

ドキュメントには一応書いてあるようだ

spark.apache.org

For Python, the equivalent --py-files option can be used to distribute .egg, .zip and .py libraries to executors.