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

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

JSONを階層構造を保ったままCSV化

Herokuで公開しているアプリ

aqueous-everglades.herokuapp.com

無かったので作りました

サンプル

{
    "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にアクセスできるユーザとそのキーが発行されている
やりたいこと
  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。