はじめに
- AWS Lambda関数をPython 3.6で記述したい
- そのPythonで、PyGreSQLを利用してPostgreSQLにアクセスしたい
という目的を果たすために、AWS Lambdaに対応したAMIでEC2インスタンスを起動し、PyGreSQLをソースコードからビルドしてみました。
しかし、PyGreSQLがlibpqに依存しており、libpqを静的リンクしてPyGreSQLをビルドする事ができなかったため、利用できませんでした。
他の方が同じ轍を踏まないように、僕がやったことを記録に残しておこうと思います。
手順
AWS Lambdaの公式ドキュメントに従い、以下のAMIを利用してEC2インスタンスを立ち上げます。
- amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
立ち上げたEC2インスタンスに接続してpythonのバージョンを確認してみると、2.7です。
$ python --version
Python 2.7.12
3.6がインストールされていないようなので、とりあえずpython 3.6をインストールしてみましょう。
$ sudo yum install python36-devel
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main | 2.1 kB 00:00:00
amzn-updates | 2.5 kB 00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ python36-devel.x86_64 0:3.6.2-5.8.amzn1 を インストール
--> 依存性の処理をしています: python36-libs(x86-64) = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36(x86-64) = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36(x86-64) = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36 = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python(abi) = 3.6 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36(alternatives) のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: /usr/bin/python3.6m のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: libpython3.6m.so.1.0()(64bit) のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ python36.x86_64 0:3.6.2-5.8.amzn1 を インストール
--> 依存性の処理をしています: python36-setuptools のパッケージ: python36-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36-pip のパッケージ: python36-3.6.2-5.8.amzn1.x86_64
---> パッケージ python36-libs.x86_64 0:3.6.2-5.8.amzn1 を インストール
--> 依存性の処理をしています: libcrypto.so.10(OPENSSL_1.0.2)(64bit) のパッケージ: python36-libs-3.6.2-5.8.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ openssl.x86_64 1:1.0.1k-15.99.amzn1 を 更新
---> パッケージ openssl.x86_64 1:1.0.2k-8.106.amzn1 を アップデート
---> パッケージ python36-pip.noarch 0:9.0.1-1.24.amzn1 を インストール
---> パッケージ python36-setuptools.noarch 0:36.2.7-1.33.amzn1 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===========================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===========================================================================================================================================================
インストール中:
python36-devel x86_64 3.6.2-5.8.amzn1 amzn-updates 1.2 M
依存性関連でのインストールをします:
python36 x86_64 3.6.2-5.8.amzn1 amzn-updates 63 k
python36-libs x86_64 3.6.2-5.8.amzn1 amzn-updates 11 M
python36-pip noarch 9.0.1-1.24.amzn1 amzn-main 2.5 M
python36-setuptools noarch 36.2.7-1.33.amzn1 amzn-main 831 k
依存性関連での更新をします:
openssl x86_64 1:1.0.2k-8.106.amzn1 amzn-updates 1.8 M
トランザクションの要約
===========================================================================================================================================================
インストール 1 パッケージ (+4 個の依存関係のパッケージ)
更新 ( 1 個の依存関係のパッケージ)
総ダウンロード容量: 18 M
Is this ok [y/d/N]: y
Downloading packages:
(1/6): python36-3.6.2-5.8.amzn1.x86_64.rpm | 63 kB 00:00:00
(2/6): openssl-1.0.2k-8.106.amzn1.x86_64.rpm | 1.8 MB 00:00:00
(3/6): python36-devel-3.6.2-5.8.amzn1.x86_64.rpm | 1.2 MB 00:00:00
(4/6): python36-setuptools-36.2.7-1.33.amzn1.noarch.rpm | 831 kB 00:00:00
(5/6): python36-pip-9.0.1-1.24.amzn1.noarch.rpm | 2.5 MB 00:00:00
(6/6): python36-libs-3.6.2-5.8.amzn1.x86_64.rpm | 11 MB 00:00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------
合計 15 MB/s | 18 MB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
更新します : 1:openssl-1.0.2k-8.106.amzn1.x86_64 1/7
インストール中 : python36-libs-3.6.2-5.8.amzn1.x86_64 2/7
インストール中 : python36-pip-9.0.1-1.24.amzn1.noarch 3/7
インストール中 : python36-3.6.2-5.8.amzn1.x86_64 4/7
インストール中 : python36-setuptools-36.2.7-1.33.amzn1.noarch 5/7
インストール中 : python36-devel-3.6.2-5.8.amzn1.x86_64 6/7
整理中 : 1:openssl-1.0.1k-15.99.amzn1.x86_64 7/7
検証中 : python36-setuptools-36.2.7-1.33.amzn1.noarch 1/7
検証中 : python36-libs-3.6.2-5.8.amzn1.x86_64 2/7
検証中 : python36-pip-9.0.1-1.24.amzn1.noarch 3/7
検証中 : python36-3.6.2-5.8.amzn1.x86_64 4/7
検証中 : python36-devel-3.6.2-5.8.amzn1.x86_64 5/7
検証中 : 1:openssl-1.0.2k-8.106.amzn1.x86_64 6/7
検証中 : 1:openssl-1.0.1k-15.99.amzn1.x86_64 7/7
インストール:
python36-devel.x86_64 0:3.6.2-5.8.amzn1
依存性関連をインストールしました:
python36.x86_64 0:3.6.2-5.8.amzn1 python36-libs.x86_64 0:3.6.2-5.8.amzn1 python36-pip.noarch 0:9.0.1-1.24.amzn1
python36-setuptools.noarch 0:36.2.7-1.33.amzn1
依存性を更新しました:
openssl.x86_64 1:1.0.2k-8.106.amzn1
完了しました!
PostgreSQL 9.6の "devel" もインストールしましょう。
$ sudo yum install postgresql96-devel
読み込んだプラグイン:priorities, update-motd, upgrade-helper
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ postgresql96-devel.x86_64 0:9.6.6-1.79.amzn1 を インストール
--> 依存性の処理をしています: postgresql96-libs(x86-64) = 9.6.6-1.79.amzn1 のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: postgresql96(alternatives) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: postgresql96(alternatives) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libpq.so.5()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libpgtypes.so.3()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libecpg_compat.so.3()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libecpg.so.6()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ postgresql96.x86_64 0:9.6.6-1.79.amzn1 を インストール
---> パッケージ postgresql96-libs.x86_64 0:9.6.6-1.79.amzn1 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===========================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===========================================================================================================================================================
インストール中:
postgresql96-devel x86_64 9.6.6-1.79.amzn1 amzn-updates 1.3 M
依存性関連でのインストールをします:
postgresql96 x86_64 9.6.6-1.79.amzn1 amzn-updates 5.0 M
postgresql96-libs x86_64 9.6.6-1.79.amzn1 amzn-updates 283 k
トランザクションの要約
===========================================================================================================================================================
インストール 1 パッケージ (+2 個の依存関係のパッケージ)
総ダウンロード容量: 6.6 M
インストール容量: 25 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): postgresql96-devel-9.6.6-1.79.amzn1.x86_64.rpm | 1.3 MB 00:00:00
(2/3): postgresql96-libs-9.6.6-1.79.amzn1.x86_64.rpm | 283 kB 00:00:00
(3/3): postgresql96-9.6.6-1.79.amzn1.x86_64.rpm | 5.0 MB 00:00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------
合計 7.1 MB/s | 6.6 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : postgresql96-libs-9.6.6-1.79.amzn1.x86_64 1/3
インストール中 : postgresql96-9.6.6-1.79.amzn1.x86_64 2/3
インストール中 : postgresql96-devel-9.6.6-1.79.amzn1.x86_64 3/3
検証中 : postgresql96-9.6.6-1.79.amzn1.x86_64 1/3
検証中 : postgresql96-libs-9.6.6-1.79.amzn1.x86_64 2/3
検証中 : postgresql96-devel-9.6.6-1.79.amzn1.x86_64 3/3
インストール:
postgresql96-devel.x86_64 0:9.6.6-1.79.amzn1
依存性関連をインストールしました:
postgresql96.x86_64 0:9.6.6-1.79.amzn1 postgresql96-libs.x86_64 0:9.6.6-1.79.amzn1
完了しました!
gccも必要だったのでインストール
$ sudo yum install gcc
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main | 2.1 kB 00:00:00
amzn-updates | 2.5 kB 00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ gcc.noarch 0:4.8.5-1.22.amzn1 を インストール
--> 依存性の処理をしています: gcc48 >= 4.8.5 のパッケージ: gcc-4.8.5-1.22.amzn1.noarch
--> トランザクションの確認を実行しています。
---> パッケージ gcc48.x86_64 0:4.8.5-11.135.amzn1 を インストール
--> 依存性の処理をしています: libgcc48(x86-64) = 4.8.5 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: cpp48(x86-64) = 4.8.5-11.135.amzn1 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libgomp(x86-64) >= 4.8.5-11.135.amzn1 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libgcc(x86-64) >= 4.8.5-11.135.amzn1 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: glibc-devel(x86-64) >= 2.2.90-12 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libmpfr.so.4()(64bit) のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libmpc.so.3()(64bit) のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libgomp.so.1()(64bit) のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ cpp48.x86_64 0:4.8.5-11.135.amzn1 を インストール
---> パッケージ glibc-devel.x86_64 0:2.17-196.172.amzn1 を インストール
--> 依存性の処理をしています: glibc-headers = 2.17-196.172.amzn1 のパッケージ: glibc-devel-2.17-196.172.amzn1.x86_64
--> 依存性の処理をしています: glibc(x86-64) = 2.17-196.172.amzn1 のパッケージ: glibc-devel-2.17-196.172.amzn1.x86_64
--> 依存性の処理をしています: glibc-headers のパッケージ: glibc-devel-2.17-196.172.amzn1.x86_64
---> パッケージ libgcc48.x86_64 0:4.8.3-9.111.amzn1 を 更新
---> パッケージ libgcc48.x86_64 0:4.8.5-11.135.amzn1 を アップデート
---> パッケージ libgomp.x86_64 0:6.4.1-1.45.amzn1 を インストール
---> パッケージ libmpc.x86_64 0:1.0.1-3.3.amzn1 を インストール
---> パッケージ mpfr.x86_64 0:3.1.1-4.14.amzn1 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ glibc.x86_64 0:2.17-157.170.amzn1 を 更新
--> 依存性の処理をしています: glibc(x86-64) = 2.17-157.170.amzn1 のパッケージ: glibc-common-2.17-157.170.amzn1.x86_64
---> パッケージ glibc.x86_64 0:2.17-196.172.amzn1 を アップデート
---> パッケージ glibc-headers.x86_64 0:2.17-196.172.amzn1 を インストール
--> 依存性の処理をしています: kernel-headers >= 2.2.1 のパッケージ: glibc-headers-2.17-196.172.amzn1.x86_64
--> 依存性の処理をしています: kernel-headers のパッケージ: glibc-headers-2.17-196.172.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ glibc-common.x86_64 0:2.17-157.170.amzn1 を 更新
---> パッケージ glibc-common.x86_64 0:2.17-196.172.amzn1 を アップデート
---> パッケージ kernel-headers.x86_64 0:4.9.85-38.58.amzn1 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===========================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===========================================================================================================================================================
インストール中:
gcc noarch 4.8.5-1.22.amzn1 amzn-main 4.1 k
依存性関連でのインストールをします:
cpp48 x86_64 4.8.5-11.135.amzn1 amzn-main 6.7 M
gcc48 x86_64 4.8.5-11.135.amzn1 amzn-main 18 M
glibc-devel x86_64 2.17-196.172.amzn1 amzn-main 1.1 M
glibc-headers x86_64 2.17-196.172.amzn1 amzn-main 751 k
kernel-headers x86_64 4.9.85-38.58.amzn1 amzn-updates 1.1 M
libgomp x86_64 6.4.1-1.45.amzn1 amzn-main 204 k
libmpc x86_64 1.0.1-3.3.amzn1 amzn-main 53 k
mpfr x86_64 3.1.1-4.14.amzn1 amzn-main 237 k
依存性関連での更新をします:
glibc x86_64 2.17-196.172.amzn1 amzn-main 5.8 M
glibc-common x86_64 2.17-196.172.amzn1 amzn-main 28 M
libgcc48 x86_64 4.8.5-11.135.amzn1 amzn-main 150 k
トランザクションの要約
===========================================================================================================================================================
インストール 1 パッケージ (+8 個の依存関係のパッケージ)
更新 ( 3 個の依存関係のパッケージ)
総ダウンロード容量: 62 M
Is this ok [y/d/N]: y
Downloading packages:
(1/12): gcc-4.8.5-1.22.amzn1.noarch.rpm | 4.1 kB 00:00:00
(2/12): cpp48-4.8.5-11.135.amzn1.x86_64.rpm | 6.7 MB 00:00:00
(3/12): glibc-2.17-196.172.amzn1.x86_64.rpm | 5.8 MB 00:00:00
(4/12): gcc48-4.8.5-11.135.amzn1.x86_64.rpm | 18 MB 00:00:01
(5/12): glibc-devel-2.17-196.172.amzn1.x86_64.rpm | 1.1 MB 00:00:00
(6/12): glibc-common-2.17-196.172.amzn1.x86_64.rpm | 28 MB 00:00:01
(7/12): kernel-headers-4.9.85-38.58.amzn1.x86_64.rpm | 1.1 MB 00:00:00
(8/12): glibc-headers-2.17-196.172.amzn1.x86_64.rpm | 751 kB 00:00:00
(9/12): libgcc48-4.8.5-11.135.amzn1.x86_64.rpm | 150 kB 00:00:00
(10/12): libgomp-6.4.1-1.45.amzn1.x86_64.rpm | 204 kB 00:00:00
(11/12): libmpc-1.0.1-3.3.amzn1.x86_64.rpm | 53 kB 00:00:00
(12/12): mpfr-3.1.1-4.14.amzn1.x86_64.rpm | 237 kB 00:00:00
-----------------------------------------------------------------------------------------------------------------------------------------------------------
合計 25 MB/s | 62 MB 00:00:02
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
更新します : libgcc48-4.8.5-11.135.amzn1.x86_64 1/15
更新します : glibc-common-2.17-196.172.amzn1.x86_64 2/15
更新します : glibc-2.17-196.172.amzn1.x86_64 3/15
warning: /etc/nsswitch.conf created as /etc/nsswitch.conf.rpmnew
インストール中 : mpfr-3.1.1-4.14.amzn1.x86_64 4/15
インストール中 : libmpc-1.0.1-3.3.amzn1.x86_64 5/15
インストール中 : cpp48-4.8.5-11.135.amzn1.x86_64 6/15
インストール中 : libgomp-6.4.1-1.45.amzn1.x86_64 7/15
インストール中 : kernel-headers-4.9.85-38.58.amzn1.x86_64 8/15
インストール中 : glibc-headers-2.17-196.172.amzn1.x86_64 9/15
インストール中 : glibc-devel-2.17-196.172.amzn1.x86_64 10/15
インストール中 : gcc48-4.8.5-11.135.amzn1.x86_64 11/15
インストール中 : gcc-4.8.5-1.22.amzn1.noarch 12/15
整理中 : libgcc48-4.8.3-9.111.amzn1.x86_64 13/15
整理中 : glibc-2.17-157.170.amzn1.x86_64 14/15
整理中 : glibc-common-2.17-157.170.amzn1.x86_64 15/15
検証中 : gcc-4.8.5-1.22.amzn1.noarch 1/15
検証中 : glibc-common-2.17-196.172.amzn1.x86_64 2/15
検証中 : glibc-2.17-196.172.amzn1.x86_64 3/15
検証中 : kernel-headers-4.9.85-38.58.amzn1.x86_64 4/15
検証中 : glibc-headers-2.17-196.172.amzn1.x86_64 5/15
検証中 : glibc-devel-2.17-196.172.amzn1.x86_64 6/15
検証中 : cpp48-4.8.5-11.135.amzn1.x86_64 7/15
検証中 : libmpc-1.0.1-3.3.amzn1.x86_64 8/15
検証中 : libgcc48-4.8.5-11.135.amzn1.x86_64 9/15
検証中 : mpfr-3.1.1-4.14.amzn1.x86_64 10/15
検証中 : gcc48-4.8.5-11.135.amzn1.x86_64 11/15
検証中 : libgomp-6.4.1-1.45.amzn1.x86_64 12/15
検証中 : libgcc48-4.8.3-9.111.amzn1.x86_64 13/15
検証中 : glibc-2.17-157.170.amzn1.x86_64 14/15
検証中 : glibc-common-2.17-157.170.amzn1.x86_64 15/15
インストール:
gcc.noarch 0:4.8.5-1.22.amzn1
依存性関連をインストールしました:
cpp48.x86_64 0:4.8.5-11.135.amzn1 gcc48.x86_64 0:4.8.5-11.135.amzn1 glibc-devel.x86_64 0:2.17-196.172.amzn1
glibc-headers.x86_64 0:2.17-196.172.amzn1 kernel-headers.x86_64 0:4.9.85-38.58.amzn1 libgomp.x86_64 0:6.4.1-1.45.amzn1
libmpc.x86_64 0:1.0.1-3.3.amzn1 mpfr.x86_64 0:3.1.1-4.14.amzn1
依存性を更新しました:
glibc.x86_64 0:2.17-196.172.amzn1 glibc-common.x86_64 0:2.17-196.172.amzn1 libgcc48.x86_64 0:4.8.5-11.135.amzn1
完了しました!
これでビルドの準備が完了したので、PyGreSQLをソースコードからビルドします。
(PyGreSQLのソースコードからのビルドについては、こちらの記事もご参照ください。)
$ wget http://pygresql.org/files/PyGreSQL.tar.gz
$ tar xvf PyGreSQL.tar.gz
$ cd PyGreSQL-5.0.4
$ python36 setup.py build
python
コマンドだとpython 2.7の方が起動してしまうので、明示的にpython36
とバージョン付きでpythonを起動することに注意してください。
ビルド成果物のライブラリをコピーします。動作確認用のAWS Lambda関数をpyファイルに記述します。
そして、これらをzipファイルにまとめます。
mkdir ~/lambda
cp -r build/lib.linux-x86_64-3.6/ ~/lambda
$ cd ~/lambda
$ cat <<EOF >> lambda_function.py
> import pg
> def lambda_handler(event, context):
> return 'ok'
> EOF
$ zip -r lambda.zip .
ここのやり方は「AWS Lambda Pythonからpsycopg2でRDS PostgreSQLに接続する」を参考にさせていただきました。ありがとうございます。
作成したzipファイルをAWS Lambdaコンソールからアップロードし、実行してみます。
zipファイルをアップロードするときは、AWS Lambda関数を「一から作成」で作成した後、以下の図のように「コード エントリ タイプ」のところから「.ZIP ファイルをアップロード」を選択します。
アップロードして実行してみると、こんなエラーが出ました。
START RequestId: 6e925418-3541-11e8-84a9-598879beed01 Version: $LATEST
Unable to import module 'lambda_function': libpq.so.5: cannot open shared object file: No such file or directory
END RequestId: 6e925418-3541-11e8-84a9-598879beed01
REPORT RequestId: 6e925418-3541-11e8-84a9-598879beed01 Duration: 0.65 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 27 MB
この方法ではlibpqが動的リンクになっており、ダメのようです。
その他いろいろ試してみたわかったこと
PyGreSQL公式ドキュメントのInstallationには、DistUtilsを使わずにビルドする方法も書かれています。
こちらを試した場合も、上記エラーとなり、駄目でした。
「AWS Lambda Pythonからpsycopg2でRDS PostgreSQLに接続する」を参考に、libpqを静的リンクしてpsycopg2をビルドしてみました。これだと正しく動かすことができました。
psycopg2のビルドを試す過程で気づいたのですが、PyGreSQLのsetup.pyがそもそもlibpqを静的リンクしてビルドすることをサポートしていないようです。setup.cfgに静的リンクに関するコンフィグ記述欄がありません。
自力でsetup.pyをいじって、静的リンクするビルドプロセスを記述できれば解決するのでしょう。しかし、僕はこの辺まだ詳しくないので、今回は諦めました。
結論
PyGreSQLは現状、libpqを静的リンクするビルドをサポートしていません。
AWS LambdaでPythonを使ってPostgreSQLにアクセスしたいときは、psycopg2を使うのが手っ取り早いです。
ビルド手順は「AWS Lambda Pythonからpsycopg2でRDS PostgreSQLに接続する」を参考にしましょう。