KAROUSHI -Japanese Engineer Blog-

コボルドからドラゴンへ -Kobold to Dragon-

システムエンジニアのブログです。サイト名は「雑魚キャラからボスキャラへレベルアップしたい!」という思いを込めて命名しました。自分はやっとリザードマンになったくらいです。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その3~

前回の記事はこちら。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~ - KAROUSHI -Japanese Engineer Blog-

API Gatewayの設定

さて3回目は最後にAPI Gatewayの作成と接続テスト実施を行います。

APIGatewayを作成する

lambdaの画面を開いて前回作成した[s3create]を選択します。

f:id:jainders:20160606201721j:plain

タブから[API endpoints][Add API endpoint]を押下します。

f:id:jainders:20160606201724j:plain

 

Add API endpoint画面が開きますので以下のように設定しましょう。
(今回はメソッドはPOSTで設定します)

 

API endpoint type:API Gateway(そのまま)
API name: LambdaMicroservice(そのまま)
Resource name: /s3create(そのまま)
Method: POST
Deployment stage: prod(そのまま)
Security: AWS IAM(そのまま)

[Submit]を押下します。

f:id:jainders:20160606201726j:plain

API endpointが作成され表示されることを確認しましょう。

APIをテストする

確認したらMethodの[POST]を選択してAPI Gatewayの画面へ遷移します。[クライアント]という文字の上にある[テスト(雷マーク)]を選択しましょう。

f:id:jainders:20160606201729j:plain

f:id:jainders:20160606201732j:plain

すると下図のようなテスト画面に遷移するので、リクエスト本文に以下のJSONをコピペして[テスト]をクリックしましょう。

{
  "Records": [
  {
    "s3": {
      "object": {
        "key": "index.html"
      },
      "bucket": {
        "name": "test.test.test.3"
      }
    }
  }
  ]
}

f:id:jainders:20160606201735j:plain

以下のようにレスポンス本文、レスポンスヘッダー、ログが表示されればOKです。

f:id:jainders:20160606201740j:plain

 

これで一通りの流れを終えました。

今回はlambda処理を自作せずにblue printから選んで作成しました。どうでしょうか?APIが簡単にできましたね。URLも生成されているのでEC2などからURL+POSTデータを実行してあげれば、EC2上で動くサービスとの連携も可能です。

pythonの場合はbotoというlambdaのライブラリがあるようなので、次回はそれを使ってもう少し高度で実践的なことをやろうと思います。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その2~

API Gateway→lambda→S3の続きです。

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~ - KAROUSHI -Japanese Engineer Blog-

 

今回はlambdaです。

pythonのlambda作成手順をあまりネット上で見かけなかったので、pythonの手順を紹介します。

lambdaの設定

Lambdaを作成する

上部タブから[サービス][Lambda]を選択します。

f:id:jainders:20160603222457j:plain

[Create a Lambda function]をクリック→"Select blue print"画面が表示されます。
(初回はcreate functionボタンが中央に表示されます)

f:id:jainders:20160603222459j:plain


検索ボックスの隣にあるプログラム選択ボックスから[Python 2.7]を選択すると、python関連のblue printが一覧で表示されます。
今回は[s3-get-object-python]を選択します。

f:id:jainders:20160603222500j:plain

 

Configure event sources画面が表示され、以下を設定して[Next]をクリックします。
Event source type: S3
Bucket: <S3に作成済みのバケット>
Event type: Object Created(All)
Prefix: 任意(空でもOK)
Suffix: 任意(空でもOK)

f:id:jainders:20160603222502j:plain

Configure function画面表示されます。
以下を設定して下へスクロールします。

Name:任意(今回はs3test)
Description: (そのまま)
Runtime: Python 2.7
Lambda function code: (そのまま)

f:id:jainders:20160603222504j:plain

以下の設定をします。

Hadnler: (そのまま)
Role: <S3 execution role>を選択します。
 →別ウィンドウが開くので以下を設定し[許可]をクリックする。
  IAMロール: lambda_s3_exec_role
  ポリシー名: 新しいロールポリシーの作成
Memory(MB): (そのまま)
Timeout: (そのまま)
VPC: (そのまま)

f:id:jainders:20160603222506j:plain

f:id:jainders:20160603222507j:plain

Review画面が表示されます。
そのまま[Create function]を押下します。

f:id:jainders:20160603222511j:plain

すると以下のような画面に遷移しfunctionの作成に成功したことが上部に表示されます。

f:id:jainders:20160603222513j:plain

 

functionのテストを実行する

[Actions][Configure test event]を押下します。

f:id:jainders:20160603222515j:plain

 

するとInput test event画面が表示されます。
すでに長いjsonが載っていますが、わかりづらいので下記に変更します。

テストコード

{
  "Records": [
  {
    "s3": {
      "object": {
        "key": "index.html"
      },
      "bucket": {
        "name": "test.test.test.3"
      }
    }
  }
  ]
}

[Save and test]でテストを実行します。

f:id:jainders:20160603224904j:plain

すると先ほどの画面に戻ります。
その画面の下部へ移動し「Execution result:succeeded(logs)」と表示されていればOKです。正常にオブジェクトが取得できています。
レスポンスとして"text/html"が返ってきていることが確認できます。
ビルド時間、応答時間などがSummaryに、ログはLog outputに表示されます。

f:id:jainders:20160603222518j:plain

 

これでlambdaの設定は完了です。

次回最後にAPI Gatewayの設定を行います。

koboldtodragon.hatenablog.com

API Gateway, Lambda, S3を使用して、ファイルを取得する処理をノンサーバで実装する~その1~

AWS流行ってるね!ノンサーバって響きがかっこいいー!でも何したらいいか分からん! 
という感じなエンジニアです。(笑)
今回は3回に分けて

API Gateway→イベントキャッチしてlambdaからS3オブジェクトを取得する処理を実行

を実装してみます。

s3の設定

S3に新しいバケットを作成する

まずはS3に新しいバケットを作成します。
サービスから[S3]を押下します。

f:id:jainders:20160602204935j:plain

 

[バケットを作成]を押下します。

f:id:jainders:20160602204956j:plain

以下を設定して[作成]を押下します。
バケット名:teset.test.test.3(任意)※1 
リージョン:Oregon(任意)※2

※1 バケット名は一意に設定する必要があります。他ユーザが既に作成しているバケットは作ることができません。
※2 リージョンにより料金設定が異なります。

f:id:jainders:20160602205024j:plain


これで新しいバケットが作成されました。

バケットにポリシーを設定する

では次にバケットポリシーを設定して、オブジェクトを取得できるようにしましょう。
以下のようにバケット名が一覧で表示されているので、バケット名[test.test.test.3]を押下します。

f:id:jainders:20160602205025j:plain

右上にある[プロパティ]を押下すると、右からウィンドウが出てきます。
[アクセス許可][バケットポリシーの追加]を押下します。

f:id:jainders:20160602205026j:plain

バケットポリシーエディターがポップアップして表示されるので以下を追記して[保存]を押下します。

バケットポリシー

{
  "Version": "2012-10-17",
  "Statement": [
  {
    "Sid": "AddPerm",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::test.test.test.3/*"
  }
  ]
}

f:id:jainders:20160602205028j:plain

これでバケットポリシーの設定は完了です。
今回設定したポリシーは

test.test.test.3配下に存在するオブジェクトの取得をすべて許可する

という設定です。

S3にファイルをアップロードする

では最後にオブジェクトをアップロードします。
まずはindex.htmlを作成します。
以下の内容のindex.htmlを作成してください。

index.html

<html>
<body>
  <p>Hello</p>
</body>
</html>

左上の[アップロード]を押下すると、アップロード画面がポップアップして表示されます。

f:id:jainders:20160602205029j:plain

ドラッグ&ドロップか、[ファイルを追加する]を押してindex.htmlを選択し、[アップロードの開始]を押下します。

f:id:jainders:20160602205030j:plain

右側に転送ステータスが表示され「完了」と表示されると、左側の一覧に表示されます。
これでオブジェクト(index.html)のアップロードは完了です。

f:id:jainders:20160602205032j:plain

S3の設定は以上です。

 

今回S3にアップロードしたindex.htmlをlambdaからアクセスして取得できるようにします。

 lamdaの設定は次回。

koboldtodragon.hatenablog.com

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

Linux: CentOS 6.7

詳細

# 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のコンパイラがないため。

対処方法

Cコンパイラyumでインストールする。

# yum -y install gcc

gitコマンドでprenvをインストールしようとしたら失敗

概要

gitコマンドでpyenvをインストールしようとしたらエラーが発生。

環境情報

VirtualBox5.0.16r105871
LinuxCentOS 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をインストールしようとしたらエラーが発生。

環境情報

VirtualBox5.0.16r105871
LinuxCentOS 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