諸事情により、AppEngineからAWSに接続することになったのですが、
エラーにより多大な時間を費やしてしまったので、自分用メモを兼ねて。
やりたかったこと
GCP上のAppEngineから、AWS上のDynamoDBに接続。
(無事にAppEngineも東京リージョン使えるようになってよかった!)
GCP側
- AppEngineのみ
- standard environment
- RuntimeはPython 2.7
- フレームワークはFlask
AWS側
- DynamoDBのみ
やってみる
AppEngineのコード
app.yaml
application: xxxxxx
module: xxxxx
runtime: python27
version: initial
handlers:
- url: .*
script: main.app
env_variables:
AWS_DEFAULT_REGION: 'ap-northeast-1'
AWS_ACCESS_KEY_ID: 'XXXXXXXXXXX'
AWS_SECRET_ACCESS_KEY: 'XXXXXXXX'
main.py
from flask import Flask, request, jsonify
import logging, json
import boto3
app = Flask(__name__)
@app.route('/<user_id>')
def dynamotest(user_id):
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table('table_name')
response = table.get_item(Key = {"user_id":user_id})
logging.info(response)
return jsonify(Result=response)
実行してみる
エラー!
NameError: global name 'ssl' is not defined.
同じコードをローカルだったりGCEだったりで動かすと全く問題ないのに、AppEngineだと動かない。
解決方法
app.yamlに以下を追記すれば解決
libraries:
- name: ssl
version: "latest"
分かってしまえばどうってことないのですが、なんだかんだこれでむっちゃ時間を浪費しました。
sslのライブラリは明示的に書かないとダメっぽい。