JSONを階層構造を保ったままCSV化
サンプル
{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } }
glossary,title,example glossary glossary,GlossDiv,title,S glossary,GlossDiv,GlossList,GlossEntry,ID,SGML glossary,GlossDiv,GlossList,GlossEntry,SortAs,SGML glossary,GlossDiv,GlossList,GlossEntry,GlossTerm,Standard Generalized Markup Language glossary,GlossDiv,GlossList,GlossEntry,Acronym,SGML glossary,GlossDiv,GlossList,GlossEntry,Abbrev,ISO 8879:1986 glossary,GlossDiv,GlossList,GlossEntry,GlossDef,para,A meta-markup language, used to create markup languages such as DocBook. glossary,GlossDiv,GlossList,GlossEntry,GlossDef,GlossSeeAlso,GML glossary,GlossDiv,GlossList,GlossEntry,GlossDef,GlossSeeAlso,XML glossary,GlossDiv,GlossList,GlossEntry,GlossSee,markup
クロスアカウントS3の設定
クロスアカウントとは
AWSのアカウントが別個に存在するということ。セキュリティ的に分けている方針もあれば、そもそも使用している会社組織が異なるために別のアカウントになっていることもあるでしょう。今回はこれでだいぶハマりました。
クロスアカウントでのS3使用のユースケース
登場人物の整理
- アカウントA, Bが存在する
- アカウントAにはbucketAが存在する
- アカウントBにはbucketBが存在する
- アカウントBのS3にアクセスできるユーザとそのキーが発行されている
やりたいこと
- アカウントBのキーでbucketBからファイルダウンロード
- ファイルを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 (コンソールエディタ)
参考にしたサイト
- Qiita AWS Lambda Layersでライブラリを共通化
- Qiita pandasをLambdaのLayerとして追加する
- Creating New AWS Lambda Layer For Python Pandas Library
もともと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