API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その3~
前回の記事はこちら。
API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~ - KAROUSHI -Japanese Engineer Blog-
API Gatewayの設定
さて3回目は最後にAPI Gatewayの作成と接続テスト実施を行います。
APIGatewayを作成する
lambdaの画面を開いて前回作成した[s3create]を選択します。
タブから[API endpoints]→[Add API endpoint]を押下します。
Add API endpoint画面が開きますので以下のように設定しましょう。
(今回はメソッドはPOSTで設定します)
API endpoint type:API Gateway(そのまま)
API name: LambdaMicroservice(そのまま)
Resource name: /s3create(そのまま)
Method: POST
Deployment stage: prod(そのまま)
Security: AWS IAM(そのまま)
→[Submit]を押下します。
API endpointが作成され表示されることを確認しましょう。
APIをテストする
確認したらMethodの[POST]を選択してAPI Gatewayの画面へ遷移します。[クライアント]という文字の上にある[テスト(雷マーク)]を選択しましょう。
すると下図のようなテスト画面に遷移するので、リクエスト本文に以下のJSONをコピペして[テスト]をクリックしましょう。
{
"Records": [
{
"s3": {
"object": {
"key": "index.html"
},
"bucket": {
"name": "test.test.test.3"
}
}
}
]
}
以下のようにレスポンス本文、レスポンスヘッダー、ログが表示されればOKです。
これで一通りの流れを終えました。
今回はlambda処理を自作せずにblue printから選んで作成しました。どうでしょうか?APIが簡単にできましたね。URLも生成されているのでEC2などからURL+POSTデータを実行してあげれば、EC2上で動くサービスとの連携も可能です。
pythonの場合はbotoというlambdaのライブラリがあるようなので、次回はそれを使ってもう少し高度で実践的なことをやろうと思います。
API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~
API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~ - KAROUSHI -Japanese Engineer Blog-
今回はlambdaです。
pythonのlambda作成手順をあまりネット上で見かけなかったので、pythonの手順を紹介します。
lambdaの設定
Lambdaを作成する
上部タブから[サービス]→[Lambda]を選択します。
[Create a Lambda function]をクリック→"Select blue print"画面が表示されます。
(初回はcreate functionボタンが中央に表示されます)
検索ボックスの隣にあるプログラム選択ボックスから[Python 2.7]を選択すると、python関連のblue printが一覧で表示されます。
今回は[s3-get-object-python]を選択します。
Configure event sources画面が表示され、以下を設定して[Next]をクリックします。
Event source type: S3
Bucket: <S3に作成済みのバケット>
Event type: Object Created(All)
Prefix: 任意(空でもOK)
Suffix: 任意(空でもOK)
Configure function画面表示されます。
以下を設定して下へスクロールします。
Name:任意(今回はs3test)
Description: (そのまま)
Runtime: Python 2.7
Lambda function code: (そのまま)
以下の設定をします。
Hadnler: (そのまま)
Role: <S3 execution role>を選択します。
→別ウィンドウが開くので以下を設定し[許可]をクリックする。
IAMロール: lambda_s3_exec_role
ポリシー名: 新しいロールポリシーの作成
Memory(MB): (そのまま)
Timeout: (そのまま)
VPC: (そのまま)
Review画面が表示されます。
そのまま[Create function]を押下します。
すると以下のような画面に遷移しfunctionの作成に成功したことが上部に表示されます。
functionのテストを実行する
[Actions]→[Configure test event]を押下します。
するとInput test event画面が表示されます。
すでに長いjsonが載っていますが、わかりづらいので下記に変更します。
テストコード
{
"Records": [
{
"s3": {
"object": {
"key": "index.html"
},
"bucket": {
"name": "test.test.test.3"
}
}
}
]
}
[Save and test]でテストを実行します。
すると先ほどの画面に戻ります。
その画面の下部へ移動し「Execution result:succeeded(logs)」と表示されていればOKです。正常にオブジェクトが取得できています。
レスポンスとして"text/html"が返ってきていることが確認できます。
ビルド時間、応答時間などがSummaryに、ログはLog outputに表示されます。
これでlambdaの設定は完了です。
API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~
AWS流行ってるね!ノンサーバって響きがかっこいいー!でも何したらいいか分からん!
という感じなエンジニアです。(笑)
今回は3回に分けて
API Gateway→イベントキャッチしてlambdaからS3オブジェクトを取得する処理を実行
を実装してみます。
s3の設定
S3に新しいバケットを作成する
まずはS3に新しいバケットを作成します。
サービスから[S3]を押下します。
[バケットを作成]を押下します。
以下を設定して[作成]を押下します。
バケット名:teset.test.test.3(任意)※1
リージョン:Oregon(任意)※2
※1 バケット名は一意に設定する必要があります。他ユーザが既に作成しているバケットは作ることができません。
※2 リージョンにより料金設定が異なります。
これで新しいバケットが作成されました。
バケットにポリシーを設定する
では次にバケットポリシーを設定して、オブジェクトを取得できるようにしましょう。
以下のようにバケット名が一覧で表示されているので、バケット名[test.test.test.3]を押下します。
右上にある[プロパティ]を押下すると、右からウィンドウが出てきます。
[アクセス許可]→[バケットポリシーの追加]を押下します。
バケットポリシーエディターがポップアップして表示されるので以下を追記して[保存]を押下します。
バケットポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test.test.test.3/*"
}
]
}
これでバケットポリシーの設定は完了です。
今回設定したポリシーは
test.test.test.3配下に存在するオブジェクトの取得をすべて許可する
という設定です。
S3にファイルをアップロードする
では最後にオブジェクトをアップロードします。
まずはindex.htmlを作成します。
以下の内容のindex.htmlを作成してください。
index.html
<html>
<body>
<p>Hello</p>
</body>
</html>
左上の[アップロード]を押下すると、アップロード画面がポップアップして表示されます。
ドラッグ&ドロップか、[ファイルを追加する]を押してindex.htmlを選択し、[アップロードの開始]を押下します。
右側に転送ステータスが表示され「完了」と表示されると、左側の一覧に表示されます。
これでオブジェクト(index.html)のアップロードは完了です。
S3の設定は以上です。
今回S3にアップロードしたindex.htmlをlambdaからアクセスして取得できるようにします。
lamdaの設定は次回。
pyenvでpython 3.5.1インストール時に"Missing the OpenSSL lib"でエラー
概要
pyenvでpython 3.5.1をインストールしようとしたらエラーが発生。
詳細
# pyenv install 3.5.1
Downloading Python-3.5.1.tgz...
-> https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
Installing Python-3.5.1...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
Please consult to the Wiki page to fix the problem.
https://github.com/yyuu/pyenv/wiki/Common-build-problems
BUILD FAILED (CentOS release 6.7 (Final) using python-build 20160509)
Inspect or clean up the working tree at /tmp/python-build.20160516110941.16104
Results logged to /tmp/python-build.20160516110941.16104.log
Last 10 log lines:
(cd /root/.pyenv/versions/3.5.1/share/man/man1; ln -s python3.5.1 python3.1)
if test "xupgrade" != "xno" ; then \
case upgrade in \
upgrade) ensurepip="--upgrade" ;; \
install|*) ensurepip="" ;; \
esac; \
./python -E -m ensurepip \
$ensurepip --root=/ ; \
fi
Ignoring ensurepip failure: pip 7.1.2 requires SSL/TLS
原因
OpenSSLのライブラリが入っていないため。
対処方法
# yum -y install openssl-devel
pyenvでpythonの2.7.11インストール失敗時に"no acceptable C compiler found in $PATH"
概要
pyenvでpythonの2.7.11をインストールしようとしたらエラーが発生。
環境情報
VirtualBox: 5.0.16r105871
詳細
# pyenv install 2.7.11
Downloading Python-2.7.11.tgz...
-> https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz
Installing Python-2.7.11...
BUILD FAILED (CentOS release 6.7 (Final) using python-build 20160509)
Inspect or clean up the working tree at /tmp/python-build.20160516110407.13929
Results logged to /tmp/python-build.20160516110407.13929.log
Last 10 log lines:
checking for --with-universal-archs... 32-bit
checking MACHDEP... linux2
checking EXTRAPLATDIR...
checking for --without-gcc... no
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/tmp/python-build.20160516110407.13929/Python-2.7.11':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
原因
Cのコンパイラがないため。
対処方法
gitコマンドでprenvをインストールしようとしたら失敗
概要
gitコマンドでpyenvをインストールしようとしたらエラーが発生。
環境情報
VirtualBox: 5.0.16r105871
Linux: CentOS 6.7
詳細
# git clone https://github.com/yyuu/pyenv.git ~/.pyenv
-bash: git: コマンドが見つかりません
原因
gitコマンドがインストールされていないため。
対処方法
yumでgitをインストールする。
# yum install git
VirtualBox CentOS 6.7 で PYCURL ERROR 6 - "Couldn't resolve host 'ftp.riken.jp'"が発生した時の対処方法
概要
Virtualbox CentOS環境でpython-setuptoolsをインストールしようとしたらエラーが発生。
環境情報
VirtualBox: 5.0.16r105871
Linux: CentOS 6.7
事象
$ yum install python-setuptools
PYCURL ERROR 6 - "Couldn't resolve host 'ftp.riken.jp'"
原因
IPv6が有効になっているため。
対処方法
IPv6を無効に設定する。
・/etc/sysconfig/networkを開いて以下を末尾に追加する。
$ sudo vim /etc/sysconfig/network
NETWORKING_IPV6=no
・/etc/modprobe.d/disable-ipv6.confを作成して以下内容を記載する。
$ vim /etc/modprobe.d/disable-ipv6.conf
options ipv6 disable=1
・/etc/sysconfig/network-scripts/ifcfg-eth0を開いて、以下を末尾に追加する。
(開くファイルは環境により異なります。私の場合はeth0を外部に繋いでいるため上記。)
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPV6INIT=no
・ネットワークをリスタートする。
$ service network restart
・yum updateを試してみる。
$ sudo yum update
・再度コマンドを実行する。
$ sudo yum install python-setuptools