[アップデート] AWS Glue Python Shellがプリロードライブラリを備えた Python 3.9環境、追加ライブラリのインストールを実際に試してみました!

2022.08.15

データアナリティクス事業本部コンサルティングチームの石川です。先日、Python 3.9をサポートと、このアップデートに合わせて柔軟プリロード環境や追加のライブラリのインストールにも対応しました。本日は、これらのアップデートについて実際に試してみました!

なお、執筆時点では、東京リージョン(ap-northeast-1)では、Python 3.9が選択できなかったため、バージニアリージョン(us-east-1)にて動作を確認しました。2022/08/22時点で、東京リージョン(ap-northeast-1)でもPython 3.9が選択できることを確認しました。

プリロードライブラリを備えた Python 3.9環境

プリロードライブラリを備えた Python 3.9環境とは、事前に分析系のライブラリをプレインストールした実行環境、とそうでない環境が選択できることを表します。プリロードライブラリは、noneanalyticsの2つが提供されました。今後は、プリロードライブラリanayticsを選択する事で、分析関連の代表的なライブラリを明示的に導入せずに利用できるようになります。

  • none:Python 3.9の標準ライブラリにawscliとbotocoreのみの実行環境
  • analytics (default):上記に加えて、分析用のライブラリを含んだ実行環境

AWS Big Data Blogによると、下記のライブラリが利用できることが紹介されています。

Python version Python 3.9
Library set analytics (default) none
avro 1.11.0 .
awscli 1.23.5 1.23.5
awswrangler 2.15.1 .
botocore 1.23.5 1.23.5
boto3 1.22.5 .
elasticsearch 8.2.0 .
numpy 1.22.3 .
pandas 1.4.2 .
psycopg2 2.9.3 .
pyathena 2.5.3 .
PyMySQL 1.0.2 .
pyodbc 4.0.32 .
pyorc 0.6.0 .
redshift-connector 2.0.907 .
requests 2.27.1 .
scikit-learn 1.0.2 .
scipy 1.8.0 .
SQLAlchemy 1.4.36 .
s3fs 2022.3.0 .

しかし、私はもっと詳しく、Python 3.9の詳細なバージョンやanalytics (default)に含まれるライブラリについて、実際にスクリプトを実行して確認します。

AWS Glue Studioの画面で、[Python Shell script editor]を選択して、[Create]ボタンを押します。

[Script]タブに実行したい、スクリプトを入力します。

[Job details]タブを選択すると、Python versionからPython 3.9が選択できるようになっています。IAM Roleを指定して、[Run]ボタンを押すと実行されます。

実行結果の出力は、CloudWatch Logsから確認できます。将来的に変更になるかもしれませんが、1/16DPUのスペック、含まれているライブラリ等は、以下のとおりです。

  • Pythonの詳細なバージョンは、Python 3.9.10
  • OSからは、2つのコアが確認
  • MemTotalは、約960MB(982176 kB)
  • ストレージの空き容量は約13.68GiB(14349104B)
  • analytics (default)のパッケージの詳細
    • aenum==3.1.11
    • aiobotocore==2.2.0
    • aiohttp==3.8.1
    • aioitertools==0.10.0
    • aiosignal==1.2.0
    • asn1crypto==1.5.1
    • async-timeout==4.0.2
    • attrs==21.4.0
    • avro==1.11.0
    • awscli==1.23.5
    • awswrangler==2.15.1
    • backoff==1.11.1
    • beautifulsoup4==4.11.1
    • boto3==1.21.21
    • botocore==1.24.21
    • certifi==2022.5.18.1
    • charset-normalizer==2.0.12
    • colorama==0.4.4
    • cx-Oracle==8.3.0
    • decorator==5.1.1
    • docutils==0.15.2
    • elastic-transport==8.1.2
    • elasticsearch==8.2.0
    • et-xmlfile==1.1.0
    • frozenlist==1.3.0
    • fsspec==2022.3.0
    • greenlet==1.1.2
    • gremlinpython==3.6.0
    • idna==3.3
    • isodate==0.6.1
    • jmespath==1.0.0
    • joblib==1.1.0
    • jsonpath-ng==1.5.3
    • lxml==4.9.0
    • multidict==6.0.2
    • nest-asyncio==1.5.5
    • numpy==1.22.3
    • openpyxl==3.0.10
    • opensearch-py==1.1.0
    • packaging==21.3
    • pandas==1.4.2
    • pg8000==1.29.1
    • ply==3.11
    • progressbar2==4.0.0
    • psycopg2==2.9.3
    • pyarrow==7.0.0
    • pyasn1==0.4.8
    • pyathena==2.5.3
    • PyMySQL==1.0.2
    • pyodbc==4.0.32
    • pyorc==0.6.0
    • pyparsing==3.0.9
    • python-dateutil==2.8.2
    • python-utils==3.3.3
    • pytz==2022.1
    • PyYAML==5.4.1
    • redshift-connector==2.0.907
    • requests==2.27.1
    • requests-aws4auth==1.1.2
    • rsa==4.7.2
    • s3fs==2022.3.0
    • s3transfer==0.5.2
    • scikit-learn==1.0.2
    • scipy==1.8.0
    • scramp==1.4.1
    • six==1.16.0
    • soupsieve==2.3.2.post1
    • SQLAlchemy==1.4.36
    • tenacity==8.0.1
    • threadpoolctl==3.1.0
    • typing_extensions==4.2.0
    • urllib3==1.26.9
    • wrapt==1.14.1
    • yarl==1.7.2

ログの内容は、以下のとおりです。(freeとdpkgはエラーになったため、出力されていません。)

No older events at this moment. 
Retry
SCRIPT_LOCATION = s3://aws-glue-assets-517444948157-us-east-1/scripts/ps_os_python39.py
file = s3://aws-glue-assets-517444948157-us-east-1/scripts/ps_os_python39.py
file to download from: s3://aws-glue-assets-517444948157-us-east-1/scripts/ps_os_python39.py
downloading s3://aws-glue-assets-517444948157-us-east-1/scripts/ps_os_python39.py; attempt: 0...
Completed 574 Bytes/574 Bytes (10.7 KiB/s) with 1 file(s) remaining
download: s3://aws-glue-assets-517444948157-us-east-1/scripts/ps_os_python39.py to glue-python-scripts-ytnG/ps_os_python39.py
downloaded s3://aws-glue-assets-517444948157-us-east-1/scripts/ps_os_python39.py.
Setting python runtime env to 3.9 analytics (default)
Setup complete. Starting script execution: 
 ---- 
 Python 3.9.10
total 80
drwxr-xr-x   1 root  root 4096 Aug 14 10:02 .
drwxr-xr-x   1 root  root 4096 Aug 14 10:02 ..
-rwxr-xr-x   1 root  root    0 Aug 14 10:02 .dockerenv
drwxr-xr-x   1 10000 root 4096 Jun  2 19:20 .pyenv
lrwxrwxrwx   1 root  root    7 Mar  7 00:13 bin -> usr/bin
dr-xr-xr-x   2 root  root 4096 Apr  9  2019 boot
drwxr-x---   2 root  root 4096 Aug 14 10:02 connection
drwxr-xr-x   5 root  root  340 Aug 14 10:02 dev
drwxr-xr-x   1 root  root 4096 Aug 14 10:02 etc
drwxr-xr-x   1 root  root 4096 Jun 27 17:55 glue
drwxr-xr-x   2 root  root 4096 Apr  9  2019 home
lrwxrwxrwx   1 root  root    7 Mar  7 00:13 lib -> usr/lib
lrwxrwxrwx   1 root  root    9 Mar  7 00:13 lib64 -> usr/lib64
drwxr-xr-x   2 root  root 4096 Mar  7 00:13 local
drwxr-xr-x   2 root  root 4096 Apr  9  2019 media
drwxr-xr-x   2 root  root 4096 Apr  9  2019 mnt
drwxr-xr-x   1 root  root 4096 Jun 27 17:57 opt
dr-xr-xr-x 108 root  root    0 Aug 14 10:02 proc
drwxr-x---   2 root  root 4096 Aug 14 10:02 reporting
dr-xr-x---   1 root  root 4096 Jun  2 19:20 root
drwxr-xr-x   1 root  root 4096 Jun  2 19:19 run
lrwxrwxrwx   1 root  root    8 Mar  7 00:13 sbin -> usr/sbin
drwxr-xr-x   2 root  root 4096 Apr  9  2019 srv
dr-xr-xr-x  13 root  root    0 Aug 14 10:02 sys
drwxrwxrwt   1 10000 root 4096 Aug 14 10:02 tmp
drwxr-xr-x   1 root  root 4096 Mar  7 00:13 usr
drwxr-xr-x   1 root  root 4096 Mar  7 00:13 var

Linux ip-172-35-61-161.ec2.internal 4.14.238-125.422.amzn1.x86_64 #1 SMP Tue Jul 20 20:51:46 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 85
model name	: Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz
stepping	: 7
microcode	: 0x500320a
cpu MHz		: 2499.998
cache size	: 36608 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves ida arat pku ospke
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips	: 4999.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 85
model name	: Intel(R) Xeon(R) Platinum 8259CL CPU @ 2.50GHz
stepping	: 7
microcode	: 0x500320a
cpu MHz		: 2499.998
cache size	: 36608 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves ida arat pku ospke
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips	: 4999.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

MemTotal:         982176 kB
MemFree:          148696 kB
MemAvailable:     495000 kB
Buffers:           83476 kB
Cached:           419968 kB
SwapCached:            0 kB
Active:           526156 kB
Inactive:         229860 kB
Active(anon):     244112 kB
Inactive(anon):       56 kB
Active(file):     282044 kB
Inactive(file):   229804 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               404 kB
Writeback:             0 kB
AnonPages:        252596 kB
Mapped:           204476 kB
Shmem:                68 kB
Slab:              49636 kB
SReclaimable:      36628 kB
SUnreclaim:        13008 kB
KernelStack:        2976 kB
PageTables:         4364 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      491088 kB
Committed_AS:    1042940 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       63400 kB
DirectMap2M:      956416 kB
DirectMap1G:           0 kB
Filesystem     1K-blocks    Used Available Use% Mounted on
overlay         20574824 6125472  14349104  30% /
tmpfs              65536       0     65536   0% /dev
tmpfs             491088       0    491088   0% /sys/fs/cgroup
/dev/nvme0n1p1  20574824 6125472  14349104  30% /reporting
shm                65536       0     65536   0% /dev/shm
tmpfs             491088       0    491088   0% /proc/acpi
tmpfs             491088       0    491088   0% /sys/firmware
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/4ZTYU5MILDXVKZP2P6WYFHXQ3L:/var/lib/docker/overlay2/l/ZL6E5BUAWWEAF3YFGVRG3VQQYJ:/var/lib/docker/overlay2/l/6MQNKE5GN73SRXRUFMM2CXU7XO:/var/lib/docker/overlay2/l/5AO6276EMPDWMXZVUYGBPWLICK:/var/lib/docker/overlay2/l/A2R4CAR7DPE5CBS2VIVBI722VX:/var/lib/docker/overlay2/l/I3LGLSX6SJZ74RWWG7WCXYZB7Y:/var/lib/docker/overlay2/l/XX4FDXKC3XLLDQD7EM55KCJPGI:/var/lib/docker/overlay2/l/K5AZRFXS7DF7GZ4ZWPGKBMDTJA:/var/lib/docker/overlay2/l/2JQNICESNBZQCVUH7FYXC7FS3Q:/var/lib/docker/overlay2/l/AG7AEVI4DJGYP6PNP4IP5CEFMG:/var/lib/docker/overlay2/l/J275KL5APRXZURU3SOSONGZTNU:/var/lib/docker/overlay2/l/CSIAVNLV4PTWCP23TQO6O6ZFF2:/var/lib/docker/overlay2/l/72YVUH6GWG537VAEIPULR6BT46:/var/lib/docker/overlay2/l/SUTQE72ZZRTN2MJJQHRGXKI3NC:/var/lib/docker/overlay2/l/3QDEODWPXADZVXITWHS625RVZH:/var/lib/docker/overlay2/l/YJ4CG6GOFXB4ZXDGFIBEGGA2XD:/var/lib/docker/overlay2/l/23LSCXLETEBALGIH4MGFYGTJ25:/var/lib/docker/overlay2/l/7HFYQSSBK7RELGW3V73XT3DS57:/var/lib/docker/overlay2/l/MVZIKYH5KMIMCJS275MLZ4K6XG:/var/lib/docker/overlay2/l/XVDTRD6OBXEIE7LXZNX5ZHMTYA:/var/lib/docker/overlay2/l/OMYPLUA7QRJONXUGK5RDVDVFAS:/var/lib/docker/overlay2/l/FVSZAYEGTWLNVFNTRGYMGMMXKR:/var/lib/docker/overlay2/l/HPIJT6R6SRWWHJPV2WKXSO364W:/var/lib/docker/overlay2/l/QHDRZLOFQWQ6GK6SS2ZKSESNOW:/var/lib/docker/overlay2/l/AH6KTNPGFEABGDUSOCMIIPF2XS:/var/lib/docker/overlay2/l/3IG52BAD4JM2T363F7OLMSN43M:/var/lib/docker/overlay2/l/FW6CLQIBEAYMW2OETESTLXMY4K:/var/lib/docker/overlay2/l/TOJGQPMFAPNWPXOMC7YN6EFH7L:/var/lib/docker/overlay2/l/GN7TC6MAIIJQFXHC5OBMTQPLY5:/var/lib/docker/overlay2/l/PJQG2MMOAF37RMB5MGRB2N52KI:/var/lib/docker/overlay2/l/XJXWIATDAFKTAKBTJ5X6R3BE7N:/var/lib/docker/overlay2/l/AQA7ZNQUDVSQIUU5DX7SLECRVR:/var/lib/docker/overlay2/l/X4UQHUGXCS6CH6SSBSCFPG7TFJ:/var/lib/docker/overlay2/l/ZL2DS46VEORH3KU76IDLV6DUUC:/var/lib/docker/overlay2/l/CMM5TPZVTFKZYTLPBPNSXIBP5T:/var/lib/docker/overlay2/l/Q2FYAES4NN52MP5N3IJTE55QYV:/var/lib/docker/overlay2/l/VP2BUZN7XVHMP2THKDLI5ZKDLH:/var/lib/docker/overlay2/l/MHESJJMZQBOXQYWMLHIYIX27VD:/var/lib/docker/overlay2/l/DKIL523H6KOOVXVSMFO2HYTZRW,upperdir=/var/lib/docker/overlay2/f54ac5f09aa2274ed18f4aa6e6335c503aac873c1dbbea03f48e889f027498ac/diff,workdir=/var/lib/docker/overlay2/f54ac5f09aa2274ed18f4aa6e6335c503aac873c1dbbea03f48e889f027498ac/work)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,size=65536k,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cgroup on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
/dev/nvme0n1p1 on /reporting type ext4 (rw,noatime,data=ordered)
/dev/nvme0n1p1 on /connection type ext4 (ro,noatime,data=ordered)
/dev/nvme0n1p1 on /etc/resolv.conf type ext4 (rw,noatime,data=ordered)
/dev/nvme0n1p1 on /etc/hostname type ext4 (rw,noatime,data=ordered)
/dev/nvme0n1p1 on /etc/hosts type ext4 (rw,noatime,data=ordered)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/latency_stats type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /sys/firmware type tmpfs (ro,relatime)
aenum==3.1.11
aiobotocore==2.2.0
aiohttp==3.8.1
aioitertools==0.10.0
aiosignal==1.2.0
asn1crypto==1.5.1
async-timeout==4.0.2
attrs==21.4.0
avro==1.11.0
awscli==1.23.5
awswrangler==2.15.1
backoff==1.11.1
beautifulsoup4==4.11.1
boto3==1.21.21
botocore==1.24.21
certifi==2022.5.18.1
charset-normalizer==2.0.12
colorama==0.4.4
cx-Oracle==8.3.0
decorator==5.1.1
docutils==0.15.2
elastic-transport==8.1.2
elasticsearch==8.2.0
et-xmlfile==1.1.0
frozenlist==1.3.0
fsspec==2022.3.0
greenlet==1.1.2
gremlinpython==3.6.0
idna==3.3
isodate==0.6.1
jmespath==1.0.0
joblib==1.1.0
jsonpath-ng==1.5.3
lxml==4.9.0
multidict==6.0.2
nest-asyncio==1.5.5
numpy==1.22.3
openpyxl==3.0.10
opensearch-py==1.1.0
packaging==21.3
pandas==1.4.2
pg8000==1.29.1
ply==3.11
progressbar2==4.0.0
psycopg2==2.9.3
pyarrow==7.0.0
pyasn1==0.4.8
pyathena==2.5.3
PyMySQL==1.0.2
pyodbc==4.0.32
pyorc==0.6.0
pyparsing==3.0.9
python-dateutil==2.8.2
python-utils==3.3.3
pytz==2022.1
PyYAML==5.4.1
redshift-connector==2.0.907
requests==2.27.1
requests-aws4auth==1.1.2
rsa==4.7.2
s3fs==2022.3.0
s3transfer==0.5.2
scikit-learn==1.0.2
scipy==1.8.0
scramp==1.4.1
six==1.16.0
soupsieve==2.3.2.post1
SQLAlchemy==1.4.36
tenacity==8.0.1
threadpoolctl==3.1.0
typing_extensions==4.2.0
urllib3==1.26.9
wrapt==1.14.1
yarl==1.7.2

追加ライブラリのインストール

この機能は、AWS Glue ETL Job(Glueバージョン2.0)のPython3ですでにサポートされていました。この度、Python ShellのPython3.9サポートに伴い追加になりました。しかし、ETL Jobと指定方法が若干異なります。

Python Shellでは、ジョブパラメータ--additional-python-modulesに既存のモジュールのバージョンを変更や新しく追加したいモジュールをカンマ区切りで指定します。

例えば、

  • モジュールの新規インストール:imbalanced-learnモジュール(0.9.1)をインストールしたい
  • モジュールの更新:scikit-learnをデフォルトの 1.0.2ではなく、最新の1.1.2を利用したい

この場合は、

ジョブパラメータ--additional-python-modulesimbalanced-learn==0.9.1,scikit-learn==1.1.2を指定します。

[Save]した後、[Run]するとモジュールのインストール、更新状況が確認できます。

モジュールの一覧から、新規にモジュールが追加、更新されたことが確認できます。

最後に

新しいプリロードライブラリを備えた Python 3.9環境は、データ分析で必要とされる主要なライブラリをサポートしました。また、今後は.wheelファイルも作らずに簡単に、ジョブパラメタにモジュール名とバージョンを設定するだけで自動的にインストールできます。後は、東京リージョンで利用できるようになるだけです!

従来のPython Shellでは、新規にモジュールを追加したい場合、.wheelファイルを作成して実行時にそのライブラリをS3から読み込む必要がありました。例えば、mysqlに接続したい場合に従来のPython3.6では、extra-py-filesに指定されたmysql_connectorは、protobufというライブラリが必要なため、内部で自動的にpip install protobufが実行します。しかし、ある日突然、protobufがPythonバージョン3.7以降を要求するようになり、インストールが失敗し、例外が発生してGlueジョブが終了するようになる事がありました。このような悲劇は、Python 3.9に変更して、追加ライブラリのインストールを用いることで、過去の出来事になるはずです。ぜひぜひ、Python 3.9への移行をご検討ください。

参考文献

合わせて読みたい