From 54d5961614b7e35093bb21ec3e6ba8f7e688951a Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 27 Jun 2024 17:31:34 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E8=A6=8F=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E3=80=82=E3=82=B3=E3=83=BC=E3=83=89=E3=83=99=E3=83=BC=E3=82=B9?= =?UTF-8?q?=E3=81=AF=E5=AE=9F=E8=A3=85=E6=A4=9C=E8=A8=BC=E6=99=82=E3=81=AE?= =?UTF-8?q?=E3=82=82=E3=81=AE=E3=82=92=E5=88=A9=E7=94=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lambda/transfer-medpass-data/Dockerfile | 19 ++ lambda/transfer-medpass-data/Pipfile | 16 + lambda/transfer-medpass-data/Pipfile.lock | 292 ++++++++++++++++++ .../src/transfer-medpass-data.py | 204 ++++++++++++ 4 files changed, 531 insertions(+) create mode 100644 lambda/transfer-medpass-data/Dockerfile create mode 100644 lambda/transfer-medpass-data/Pipfile create mode 100644 lambda/transfer-medpass-data/Pipfile.lock create mode 100644 lambda/transfer-medpass-data/src/transfer-medpass-data.py diff --git a/lambda/transfer-medpass-data/Dockerfile b/lambda/transfer-medpass-data/Dockerfile new file mode 100644 index 00000000..b33f6e2f --- /dev/null +++ b/lambda/transfer-medpass-data/Dockerfile @@ -0,0 +1,19 @@ +FROM python:3.9 + +ENV TZ="Asia/Tokyo" + +WORKDIR /function +COPY Pipfile Pipfile.lock ${WORKDIR} +RUN \ + apt update -y && \ + # パッケージのセキュリティアップデートのみを適用するコマンド + apt install -y unattended-upgrades && \ + unattended-upgrades && \ + pip install --upgrade pip wheel setuptools && \ + pip install pipenv --no-cache-dir && \ + pipenv install --system --deploy && \ + pip uninstall -y pipenv virtualenv-clone virtualenv +COPY src ./ + +ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ] +CMD [ "transfer-medpass-data.handler" ] diff --git a/lambda/transfer-medpass-data/Pipfile b/lambda/transfer-medpass-data/Pipfile new file mode 100644 index 00000000..f54fe4aa --- /dev/null +++ b/lambda/transfer-medpass-data/Pipfile @@ -0,0 +1,16 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +awslambdaric = "*" +boto3 = "*" +pyzipper = "*" + +[dev-packages] +autopep8 = "*" +flake8 = "*" + +[requires] +python_version = "3.9" diff --git a/lambda/transfer-medpass-data/Pipfile.lock b/lambda/transfer-medpass-data/Pipfile.lock new file mode 100644 index 00000000..1cf927ca --- /dev/null +++ b/lambda/transfer-medpass-data/Pipfile.lock @@ -0,0 +1,292 @@ +{ + "_meta": { + "hash": { + "sha256": "aedbb7748f654696e0433a6c30f5bee011d6cf0acff5d4cc6fe8b4a6d7c617aa" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "awslambdaric": { + "hashes": [ + "sha256:04d4d4b63cef0e9aad3adea95a5cf3f81634bccde625f104ff025f764a3e8874", + "sha256:0a9922690eb7722417cbac55b913ab070c88444ab83290293debf29d5d9ca371", + "sha256:0e55a815caef1258ed7a9b0adad54e5f1b2ca63966d21342dc5da5b55dd471ef", + "sha256:2566a9db2c613fddddc22aedb45e74dbcd5c1a044da6992424680be719db80c9", + "sha256:34a3e8d27b84ccc9535086487eed50425c0db7a016bf91cf24d8d6cc853faec3", + "sha256:403109390f1a9856f8f6d5f0d5e7f2f83bdec99a62d024e433bff50eda2ed373", + "sha256:4dbd3e2262d080327a90e1ac9d087d7616e8b5be6da83be9fd3ca1b5ae575173", + "sha256:506f004ca08a2f43a898b65dad9d6dd2b2a4910ebe43dcc6682dc5ca0267c24a", + "sha256:662b95b6079b563d3e2ef4fda7bcb20e360901eae7a646425612ef2f4e5d6bdf", + "sha256:6de8d5ea0fc8cb780e060fc06a84328fda3ed329faf97606db59287814490ade", + "sha256:6f298068e2791b0ec5c420ef27cdf8aaba23486dfa5917b6c3067e30c97dde4f", + "sha256:7699c822197f98cc22c262af2368c99d69b43a73113099be52545b195c5e0064", + "sha256:7b75376d62a294e37d96507a68290dd94ce83f5b1a597c42d29242545e1ee126", + "sha256:98b16b4752f16b6a0562cfc1db2e6ce63b2a41ffa97c27e784c3ae5e8c2dc91d", + "sha256:bf57203ebeb4d718b34cd168f6b5ef497bfd2481adf848c5252faf38dccd7bf1", + "sha256:bf824aeff2cde789db1167c377573f1dbf2bf01e75eeb31651de00786ef09ed0", + "sha256:d3438bf0be646d61f8a60fb668c0c3b103963611462f35bf2db11ef50242f54f", + "sha256:d530ab882984188436f3869a2fc172086ab6b43a5f7502a86b241347a5441de3", + "sha256:e4be962e90035f362511eac65ad5c0242da15f73cfae27716de42b47f9d0a2a8", + "sha256:e5145fa63560901d7dbe26c5ee0dd5977f3783ab799fa04f50c50c207be78305", + "sha256:eb1a13c130a8a2ffc1c127a2bd581f45b9f10ec32a3892e41b5b1bdc9788b92d", + "sha256:ed798ab90f5230fe11079b269c3748bd875bc218c2ad4528ae2b4a04a0cd92b5", + "sha256:f55cf42cea67661ccea604b7774ba8cb1e467dadaf3d4c4b7f4e029faf43a46b" + ], + "index": "pypi", + "version": "==2.0.11" + }, + "boto3": { + "hashes": [ + "sha256:684cba753d64978a486e8ea9645d53de0d4e3b4a3ab1495b26bd04b9541cea2d", + "sha256:db7bbb1c6059e99b74dcf634e497b04addcac4c527ae2b2696e47c39eccc6c50" + ], + "index": "pypi", + "version": "==1.34.92" + }, + "botocore": { + "hashes": [ + "sha256:4211a22a1f6c6935e70cbb84c2cd93b29f9723eaf5036d59748dd104f389a681", + "sha256:d1ca4886271f184445ec737cd2e752498648cca383887c5a37b2e01c8ab94039" + ], + "markers": "python_version >= '3.8'", + "version": "==1.34.92" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "pycryptodomex": { + "hashes": [ + "sha256:0daad007b685db36d977f9de73f61f8da2a7104e20aca3effd30752fd56f73e1", + "sha256:108e5f1c1cd70ffce0b68739c75734437c919d2eaec8e85bffc2c8b4d2794305", + "sha256:19764605feea0df966445d46533729b645033f134baeb3ea26ad518c9fdf212c", + "sha256:1be97461c439a6af4fe1cf8bf6ca5936d3db252737d2f379cc6b2e394e12a458", + "sha256:25cd61e846aaab76d5791d006497134602a9e451e954833018161befc3b5b9ed", + "sha256:2a47bcc478741b71273b917232f521fd5704ab4b25d301669879e7273d3586cc", + "sha256:59af01efb011b0e8b686ba7758d59cf4a8263f9ad35911bfe3f416cee4f5c08c", + "sha256:5dcac11031a71348faaed1f403a0debd56bf5404232284cf8c761ff918886ebc", + "sha256:62a5ec91388984909bb5398ea49ee61b68ecb579123694bffa172c3b0a107079", + "sha256:645bd4ca6f543685d643dadf6a856cc382b654cc923460e3a10a49c1b3832aeb", + "sha256:653b29b0819605fe0898829c8ad6400a6ccde096146730c2da54eede9b7b8baa", + "sha256:69138068268127cd605e03438312d8f271135a33140e2742b417d027a0539427", + "sha256:6e186342cfcc3aafaad565cbd496060e5a614b441cacc3995ef0091115c1f6c5", + "sha256:76bd15bb65c14900d98835fcd10f59e5e0435077431d3a394b60b15864fddd64", + "sha256:7805830e0c56d88f4d491fa5ac640dfc894c5ec570d1ece6ed1546e9df2e98d6", + "sha256:7a710b79baddd65b806402e14766c721aee8fb83381769c27920f26476276c1e", + "sha256:7a7a8f33a1f1fb762ede6cc9cbab8f2a9ba13b196bfaf7bc6f0b39d2ba315a43", + "sha256:82ee7696ed8eb9a82c7037f32ba9b7c59e51dda6f105b39f043b6ef293989cb3", + "sha256:88afd7a3af7ddddd42c2deda43d53d3dfc016c11327d0915f90ca34ebda91499", + "sha256:8af1a451ff9e123d0d8bd5d5e60f8e3315c3a64f3cdd6bc853e26090e195cdc8", + "sha256:8ee606964553c1a0bc74057dd8782a37d1c2bc0f01b83193b6f8bb14523b877b", + "sha256:91852d4480a4537d169c29a9d104dda44094c78f1f5b67bca76c29a91042b623", + "sha256:9c682436c359b5ada67e882fec34689726a09c461efd75b6ea77b2403d5665b7", + "sha256:bc3ee1b4d97081260d92ae813a83de4d2653206967c4a0a017580f8b9548ddbc", + "sha256:bca649483d5ed251d06daf25957f802e44e6bb6df2e8f218ae71968ff8f8edc4", + "sha256:c39778fd0548d78917b61f03c1fa8bfda6cfcf98c767decf360945fe6f97461e", + "sha256:cbe71b6712429650e3883dc81286edb94c328ffcd24849accac0a4dbcc76958a", + "sha256:d00fe8596e1cc46b44bf3907354e9377aa030ec4cd04afbbf6e899fc1e2a7781", + "sha256:d3584623e68a5064a04748fb6d76117a21a7cb5eaba20608a41c7d0c61721794", + "sha256:e48217c7901edd95f9f097feaa0388da215ed14ce2ece803d3f300b4e694abea", + "sha256:f2e497413560e03421484189a6b65e33fe800d3bd75590e6d78d4dfdb7accf3b", + "sha256:ff5c9a67f8a4fba4aed887216e32cbc48f2a6fb2673bb10a99e43be463e15913" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==3.20.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, + "pyzipper": { + "hashes": [ + "sha256:0adca90a00c36a93fbe49bfa8c5add452bfe4ef85a1b8e3638739dd1c7b26bfc", + "sha256:6d097f465bfa47796b1494e12ea65d1478107d38e13bc56f6e58eedc4f6c1a87" + ], + "index": "pypi", + "version": "==0.3.6" + }, + "s3transfer": { + "hashes": [ + "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19", + "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d" + ], + "markers": "python_version >= '3.8'", + "version": "==0.10.1" + }, + "simplejson": { + "hashes": [ + "sha256:01f426ee9e3a2d205aa4c22c3da996b51f2de75c4199ef703258a28b304dea8c", + "sha256:03de1ec4ad734f28ca49b0a758b997d752be0d089ed30360157c4e8811999c8f", + "sha256:041dd69026284d10f035cefb4a75026d2cfcef31f31e62585eeb2b7776e7e047", + "sha256:05a668d4a93816fb8a644e90e7987aa3beeb9d2112ca50a474d41e6acb5bb88a", + "sha256:094275b1b8f003afce1167c8a674cd1ee2fd48c566632dac5d149901d5012ff8", + "sha256:097e48686e49026836ef384c7c10ca670acc023cb16a976a689c2eb6c1852df4", + "sha256:0cc9a47bf8cde85c99db5f4a919bb756e62427ade0f2e875a6ec89ae8492d486", + "sha256:0cdb5069870f7d26a34e5adc30672d0a7b26e652720530a023bb3a8d8a42e37f", + "sha256:0dcc54e7cfbd9674ec4ca181e26eaa5b038446601faeaa6c83d146ddef2f2652", + "sha256:16fbebfc38ad4285c256d2430797fd669b0437d090e985c6d443521d4303b133", + "sha256:1844d7782652f859d9648531778582d4842d80cfff8d334eb23bb8da0d22a1b0", + "sha256:2362c66d2c633925d90f2f177f05e0570d320d986130d34dff9ad6edbf7be8ac", + "sha256:29a86bc9c8a913a4e0ffab85c563a7505cdf4bd13fba05342f8314facc0b7586", + "sha256:2a6e5c0e0817fb20dbb880c83caebbd4ef39f1901f6f8e53b73a3c74de4e5172", + "sha256:2d1b47f768e1f4c1c8a9457effabed735939401e85c0ddcdf68444c88a9242e6", + "sha256:30e381471158290ccb79bd31e7bbda4c8f2cf7e1a5f6b557c1b97d6036ccd05b", + "sha256:313dfd911723dc3022fed7050a7b315d5d0681cd56eee08e44e2cbd39fd9ad81", + "sha256:32de1672f91a789cc9e1c36c406b2d75457a242d64e9e73a70b9b814ef00095e", + "sha256:340b7d085b4a5063aacb8664b1250e4a7426c16e1cc80705c548a229153af147", + "sha256:34d95ad8e27754f0d91917600d6ea273e05c82a71021f168c45be48637d9502f", + "sha256:3d549efc7e8f9a180c59462b124991b690ff25c235d5cf495c3246c66a7679cd", + "sha256:3dbfaa79b1c0efdb768392a19110f1aff793f3e8d43f57e292f46734b8affb45", + "sha256:44058bea97429cfa0d6fb1d8eb0736a77022f34a326d5bc64fd6fed8d9304571", + "sha256:46b8cc86204b51eddcf157cbaf3c44a20f24393030442af0909eeb961186cb67", + "sha256:47509775a5c41ec2a6cd17c9c00fc14965cad8e6670059663872ba5e39332f57", + "sha256:4b5df4ee48403885046c6f4fd8adc84c4ac0adec69482f22a17bd4ba52876341", + "sha256:544e5607142d66a469ecf78a3154ec0f915834dc3b8cfdb2677a78ca58319ad6", + "sha256:56d36f47bc7c7684504f0f18feb161a0b1162546b3622e45aa6155f8285180ac", + "sha256:5b217201efc007166e24e9a282007cc208a2d059350a7c5bd0b0303460ad3019", + "sha256:5c4f59dd358c3a99efa46d62dc1583be3a1c37171f5240c4cbdc2d5838870902", + "sha256:5d45ed9452a42064805143480397b586ea2ea322f4b8b69034c51181e7f38342", + "sha256:6197cfebe659ac802a686b5408494115a7062b45cdf37679c4d6a9d4f39649b7", + "sha256:65de5876e34780b43f92d9d2539de16ecc56d16f56e56e59b34adfa1cebe064f", + "sha256:676e8c182f8079851f12ae1cee2fcebe04def2da2a5703a9d747ab125af47732", + "sha256:682b202f56d9d9e1bb22eaca3e37321002223fd5ddef7189b9233e3c14079917", + "sha256:695da62e494e4689ab78fae173a78390a175b6a5ccc4292277ce0f8dba3945d5", + "sha256:6d65ea4582b47d77e9094c22eb0aeded0ebd96c1df86e988870b40c6514c6e21", + "sha256:706a7fc81ceeb321a1040d008b134056012188f95a5c31ad94fb03153b35cc84", + "sha256:7339bd6203351555c1e728acd601ba95ebce0f6041ebdb386e025f00af3f1769", + "sha256:7701a289d45fdfeb37f1d15cf638801cea439df667a613379443772a86e82936", + "sha256:7f27a079cb009ba569983061a50a9270b7e1d35f81e4eeaf0e26f8924027e550", + "sha256:827ddc3b3603f7d0421b054388da6face7871d800c4b3bbedeedc8778e4085ea", + "sha256:8ccc982197982cdda19e3e5ba4ef7f6ad6bed3eb39bb423bfbf7fa2cd29488ab", + "sha256:8f381747c2edebe3c750a571e55103bfcc33b2707a9b91ae033ab9ba718d976a", + "sha256:93ba80fbf959b5852554f23201a5f4b30885930c303546ffa883859a435ea3cf", + "sha256:9a50a9da1cf93e35f26c4ddee162abf3184a340339ec2d4001c34607b87e71b4", + "sha256:a1163bfe5d043c20adeb5c4c8e89dd1dd39b375c8ca6f1c1e35ec537ad7a12e7", + "sha256:a2285609b4edbf9957440642493788ebef6583042b3fb96217c2e71f29bc6d80", + "sha256:a255d30cda6334ba780eb40a56e8134efd3453948b995d3966e45212e34bf018", + "sha256:a3bba99178f1b25878752a8bc6da2f93fbae754ebd4914d2ac4b869b9fb24102", + "sha256:a56005332d70b8d02d476d4a85818b27b01e51dac1a21d5c1a1d8a5df2efb4a6", + "sha256:a89d7fe994b115f0a792e6673f387af3db812a1760d594abad51e0ea11d3e470", + "sha256:a8ac155e3fd3b54a63040df024e57e62c130b15a2fc66eff3c2a946f42beed52", + "sha256:ab5941e1fd509fc151258477ef4b663fe14c94f8faf3581827bf4b02080fd4ba", + "sha256:ab64f087c5863ac621b42e227e5a43bd9b28de581afe7be12ad96562b9be8203", + "sha256:ad37f25fd8dfbed80815c3281b82a165be2a74e663856b9a50099d18789987bc", + "sha256:b17026f3f349a6e87818cd3531e3bbb5cc78a6f4b2b6718f574a8e0512d71e08", + "sha256:b43d3c2e204d709af955bdb904ae127fe137363ace87fbf7dc8fe6017f7f8449", + "sha256:b482d1fdd8f860e743c7de8cd6dfe54fb9fe8cd6ccba29e2966912ac89e17b2f", + "sha256:b6c6cfc492710d8f0303705fa1ff7bb3d6a145f523384e45a6f3b13ada37021f", + "sha256:b9893852c559998f667e6434d2c2474518d4cdfd1b9cec8e57b3c9d577ba55c1", + "sha256:bd694c465cc61fa8e599355e535b6eb561279834d9883aeef08d0e86c44c300c", + "sha256:c0444423129df448788edc66a129bc7560ad7d6a661d74f0900959c0b44349a1", + "sha256:c37b092d29741096c4723f48924a80b1d3de62ca1de254ce88178fa083dd520c", + "sha256:ced906b172bfad62736a27cfafcb6e24bc9938533b0529ff8150f7926fe35b54", + "sha256:d0d3b9f7cee233368d92c89746dde74313abafaa3ec1f0c06a3f4f164dc27bcc", + "sha256:d5f67bffa6fc68e391b2250e1feb43d534ded64a7b918eb89cf7e3e679759d94", + "sha256:d9f0dfde448611f4f818da05f9b544a78f29355dc39151b0dad8e7c65c513e4f", + "sha256:da6dc0cb00ef1e1a8daf285074ca8b2bb89591170c42ceab0c37bcdb9adc802c", + "sha256:dc74a9ef4d61e18ee6f1886b6ef1fe285b1f432885288afacfb7402f7d469448", + "sha256:deb71e6166e4f1264174d78b5b88abd52b14c6649e6eabaf9cf93cb1c7362850", + "sha256:e042ae053e05fe193514d51d6b0f0243729961901e9a75f8b596bfaf69522c52", + "sha256:e2f87a483c4ab0bb2a9adc9ca09173e7f7cf3696e4fa67bd45a6b33181e57921", + "sha256:e2fa1ee5ca34ab2ecfbe3f7a7e952a1ecaebb5b4818f002b5b146324912ac3d5", + "sha256:e7d3f7cd57ce0c6a5bb8133f8ed5c3d1be0473a88b7d91a300626298f12d0999", + "sha256:edb334cab35dcd90eb563fdacb085f10e5dd0b1acb57fa43f8933308b42a8f88", + "sha256:efae49d0148ec68b6e012f1b9e19bd530f4dced378ba919e3e906ae2b829cc31", + "sha256:f1085cadec0f7e76377951d7a87744628c90ac6cc634fc97eecce0c4d41ec563", + "sha256:f15f56b3119fb71fa57eb4613bcd87eb7df6c2f3547de7d341853d3e50cef97e", + "sha256:f1b425a857ce52e651739314e4118fc68bd702ef983148b8fd5cb6f68bb6a020", + "sha256:f31e126204ec38f92dee119af87cf881044ef7dea6f7477ef774ed3d84199c24", + "sha256:f5e0a03e533313eee9437ccc6c4eab47369f17bc919b57df4a20ccd8bc85d8fd", + "sha256:f85d87986ca375b8305b5c4f166783b8db383a6469e8b99b8dba22878388f234", + "sha256:fa6fe8fa94a831886ee164ac03514f361e1387a62a1b9da32fde5c0c1f27fa8d", + "sha256:fb0f8b35c11fd8e4b924f974d331b20fa54555282451db7f2a3b24bd2d33cc11" + ], + "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==3.18.4" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "urllib3": { + "hashes": [ + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" + ], + "markers": "python_version < '3.10'", + "version": "==1.26.18" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:1fa8964e4618929488f4ec36795c7ff12924a68b8bf01366c094fc52f770b6e7", + "sha256:2bb76888c5edbcafe6aabab3c47ba534f5a2c2d245c2eddced4a30c4b4946357" + ], + "index": "pypi", + "version": "==2.1.0" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "version": "==7.0.0" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + } + } +} diff --git a/lambda/transfer-medpass-data/src/transfer-medpass-data.py b/lambda/transfer-medpass-data/src/transfer-medpass-data.py new file mode 100644 index 00000000..efb7e42c --- /dev/null +++ b/lambda/transfer-medpass-data/src/transfer-medpass-data.py @@ -0,0 +1,204 @@ +import datetime +import logging +import os +from zoneinfo import ZoneInfo + +import boto3 +import pyzipper +from pyzipper.zipfile import BadZipFile + +# 環境変数 +# mbj-newdwh2021-staging-data +DATA_IMPORT_BUCKET = os.environ["DATA_IMPORT_BUCKET"] +# mbj-newdwh2021-staging-backup-medpass +MEDPASS_BACKUP_BUCKET = os.environ["MEDPASS_BACKUP_BUCKET"] +MEDPASS_TARGET_FOLDER = os.environ["MEDPASS_TARGET_FOLDER"] # medpass/target +# /staging/s3/medpassZipExtractPassword +MEDPASS_ZIP_PASSWORD_PARAMETER_STORE_KEY = os.environ["MEDPASS_ZIP_PASSWORD_PARAMETER_STORE_KEY"] +LOG_LEVEL = os.environ["LOG_LEVEL"] +TZ = os.environ["TZ"] + +# 定数 +# 多重起動抑制用のコントロールファイルの拡張子 +EXCLUSIVE_CONTROL_FILE_EXT = '.doing' +# tmpフォルダパス +PATH_TMP = '/tmp' +# 拡張子 +ZIP_FILE_EXT = 'zip' +CSV_FILE_EXT = 'csv' + +# S3クライアント +s3_client = boto3.client('s3') +# SystemsManagerクライアント +ssm_client = boto3.client('ssm') + +# logger設定 +logger = logging.getLogger() + + +def log_datetime_convert_tz(*arg): + """ログに出力するタイムスタンプのロケールを変更する(JST指定)""" + return datetime.datetime.now(ZoneInfo(TZ)).timetuple() + + +formatter = logging.Formatter( + '[%(levelname)s]\t%(asctime)s\t%(message)s\n', + '%Y-%m-%d %H:%M:%S' +) +formatter.converter = log_datetime_convert_tz +for handler in logger.handlers: + handler.setFormatter(formatter) + +level = logging.getLevelName(LOG_LEVEL) +if not isinstance(level, int): + level = logging.INFO +logger.setLevel(level) + + +def extract_zip_with_password(zip_filepath: str, extract_to_folder: str, password: str): + """ + 暗号化ZIPを解凍する。 + + :param zip_filepath: ZIPファイルが保管されているフォルダパス + :param extract_to_folder: ZIPファイルの解凍先フォルダ + :param password: ZIPパスワード + """ + # ZIPを解凍 + try: + with pyzipper.AESZipFile(zip_filepath) as z: + # ZIP内のファイルは1つのみ + inner_filename = z.filelist[0].filename + z.extractall(path=extract_to_folder, pwd=password.encode()) + except BadZipFile as e: + pass + except Exception as e: + pass + + logger.info(f'解凍先フォルダ: {os.listdir("/tmp")}') + logger.info(f'解凍ファイルパス: {os.path.join(extract_to_folder, inner_filename)}') + return os.path.join(extract_to_folder, inner_filename) + + +def get_s3_event_parameter(event: dict): + s3_event = event["Records"][0]["s3"] + event_bucket_name = s3_event["bucket"]["name"] + event_object_key = s3_event["object"]["key"] + event_file_name = os.path.basename(event_object_key) + event_folder_name = os.path.dirname(event_object_key).split('/')[0] + + return event_bucket_name, event_object_key, event_file_name, event_folder_name + + +def get_ssm_params(parameter_key: str, with_decryption: bool = True): + response = ssm_client.get_parameter( + Name=parameter_key, WithDecryption=with_decryption) + parameter_value = response['Parameter']['Value'] + return parameter_value + + +def delete_doing_file(event_bucket_name: str, event_object_key: str): + # ⑨ メモリに保持したバケット名/フォルダ名内の「受信データファイル名.doing」ファイルを削除する + s3_client.delete_object( + Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') + + +def handler(event, context): + try: + # ① 処理開始ログを出力する + logger.info('I-01-01 処理開始 medパスデータ解凍・復号化・転送処理') + + # ② 処理開始時に受け取ったイベント情報をログに出力する + # バケット名・フォルダ名・受信データファイル名をメモリに保持 + ( + event_bucket_name, + event_object_key, + event_file_name, + event_folder_name + ) = get_s3_event_parameter(event) + logger.info(f'I-02-01 受信バケット:{event_bucket_name}') + logger.info(f'I-02-01 フォルダ名:{event_folder_name}') + logger.info(f'I-02-01 ファイル名:{event_file_name}') + # ③ S3イベントによるLambdaの重複発火防止の為、メモリに保持したバケット名/フォルダ名内に、「受信データファイル名.doing」ファイルが存在するかチェックする + try: + s3_client.head_object( + Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}') + logger.error( + f'E-01-01 {event_bucket_name}/{event_object_key}は現在処理中です。処理を終了します。') + return + except Exception: + # .doingファイルが見つからなかった場合は、処理を続行する + # メモリに保持したバケット名/フォルダ名内に、「受信データファイル名.doing」ファイルを作成する + logger.info('I-03-01 medパスデータの解凍・復号化・転送を開始します') + s3_client.put_object( + Bucket=event_bucket_name, Key=f'{event_object_key}{EXCLUSIVE_CONTROL_FILE_EXT}', Body=b'') + + # ④ S3から暗号化ZIPファイルを読み込む + try: + logger.info( + f'I-04-01 暗号化ZIPファイル読込 読込元:{event_bucket_name}/{event_object_key}') + s3_client.download_file( + event_bucket_name, event_object_key, os.path.join(PATH_TMP, event_file_name)) + logger.info('I-04-02 暗号化ZIPファイルをダウンロードしました') + except Exception as e: + logger.exception(f'E-04-01 暗号化ZIPファイルのダウンロードに失敗しました エラー内容:{e}') + raise e + + # ⑤ ZIP解凍パスワードをSSM パラメータストアから取得する + try: + logger.info( + f'I-05-01 ZIP解凍パスワードを読み込み 読込元:{MEDPASS_ZIP_PASSWORD_PARAMETER_STORE_KEY}') + zip_password = get_ssm_params( + MEDPASS_ZIP_PASSWORD_PARAMETER_STORE_KEY) + except Exception as e: + logger.exception(f'E-05-01 ZIP解凍パスワードの読み込みに失敗しました エラー内容:{e}') + raise e + + # ⑥ ZIPファイルを解凍してローカルに保存 + try: + logger.info(f'I-06-01 ZIP解凍開始') + extracted_zip_file_path = extract_zip_with_password( + os.path.join(PATH_TMP, event_file_name), PATH_TMP, zip_password) + except Exception as e: + logger.exception(f'E-06-01 ZIPの解凍に失敗しました エラー内容:{e}') + raise e + logger.info(f'I-06-02 ZIP解凍成功') + # ⑦ バックアップS3バケットにコピー + copy_source = {'Bucket': event_bucket_name, 'Key': event_object_key} + execute_date_yyyymm = datetime.date.today().strftime('%Y/%m/%d') + s3_client.copy_object( + Bucket=MEDPASS_BACKUP_BUCKET, + Key=f'{execute_date_yyyymm}/{event_file_name}', + CopySource=copy_source + ) + logger.info( + f'I-07-01 medパス受信データのバックアップ完了:{MEDPASS_BACKUP_BUCKET}/{execute_date_yyyymm}/{event_file_name}') + + # ⑧ データ登録S3バケットにアップロード + csv_file_name = extracted_zip_file_path.split('/')[-1] + logger.info(csv_file_name) + s3_client.upload_file( + extracted_zip_file_path, + Bucket=DATA_IMPORT_BUCKET, + Key=f'{MEDPASS_TARGET_FOLDER}/{csv_file_name}' + ) + + # アップロード後、元のバケットからは削除する + s3_client.delete_object(Bucket=event_bucket_name, Key=event_object_key) + logger.info( + f'I-08-01 Encise受信データの転送完了:{DATA_IMPORT_BUCKET}/{MEDPASS_TARGET_FOLDER}/{csv_file_name}') + + # ⑨ メモリに保持したバケット名/フォルダ名内の「受信データファイル名.doing」ファイルを削除する + delete_doing_file(event_bucket_name, event_object_key) + + logger.info('I-08-09 処理終了 Medpass受信データ転送処理') + + except Exception as e: + logger.exception(f'想定外のエラーが発生しました。処理を終了します。 例外内容:{e}') + ( + event_bucket_name, + event_object_key, + _, + _ + ) = get_s3_event_parameter(event) + delete_doing_file(event_bucket_name, event_object_key) + raise e