【初めてのaws】aws lambdaでウェブサイトのmetaタグ取得APIを作る
前回、Amazon Web Service(AWS)に登録したので、今回は早速サービスを作ってみたいと思います。
awsへの登録がまだの場合は前回の記事を見てください。
AWS Lambdaを使って作るサービス
今回作るのは下図のようなサービスです。
ブログにはSNS(Twitter等)で貼り付けやすいようにメタタグというものが設定されています。(SNSでちゃんとシェアされるブログにする:metaタグ設定)
今回のサービスは「APIにURLを投げるとそのURLのページに設定されているog, twitterのメタタグをjson形式で取ってきてくれる」サービスです。
うまく使うと、記事にいろいろなブログを貼り付けられるようになるのでいろいろ便利になります。
AWS Lambdaとは
AWS Lambdaとは世間的には「サーバレスアーキテクチャ」とか格好いい名前で呼ばれていますが要は「CGI」です。←怒られそう
レンタルサーバーにCGIのスクリプトをアップロードするのと違うところといえば、自動スケールしたり、堅牢だったりするところです。(無料枠内で結構遊べます)
AWS Lambda,API Gateway設定
awsコンソールにIAMユーザでログインして、サービスからLambdaを選び「関数の作成」ボタンをクリックします。
関数の作成オプションは「一から作成」を選んで、基本的な情報を下の画面のように設定します。
作成できたら、トリガーを追加をクリックします。
トリガーは「API Gateway」を選択します。
ここまでで形的には最初に載せたアーキテクチャの図のようになったはずです。
AWS Lambdaプログラミング
作成したLambda関数の箱をクリックすると下にスクリプトを書くためのエディタ画面が出てきます。
ライブラリを何も使わないならこのまま書けば良いのですが、ライブラリを使う場合は「.zipファイルをアップロード」メニューでライブラリまるごとアップロードする必要があります。
今回は以下の2つのライブラリを使うので別途zipファイルを作る必要があります。
- requests : ブログ情報を取得するためのhttp getリクエストを投げるためのライブラリ
- beautifulsoup : 取得したブログを分解してメタタグを取り出すためのパーサーライブラリ
AWS Lambdaスクリプト本体
aws gatewayがどのような構造でユーザーからのリクエストを投げて来るかは、「Working with AWS Lambda Proxy Integrations for HTTP APIs - Amazon API Gateway」に書いてあるのですが、GETのクエリパラメータは「queryStringParameters」に入ってるというのがポイントです。
これがCGIのパラメータだと思えば作り方がCGIっぽいという意味がわかるかと思います。
lambda_function.pyとして作成
import requests
from bs4 import BeautifulSoup #beautifulsoup4
import json
def lambda_handler(event, context):
r = requests.get(event['queryStringParameters']['url'])
soup = BeautifulSoup(r.content,'html.parser')
meta_list = {
'meta[name="description"]' : "description",
'meta[name="keywords"]' : "keywords",
'meta[name="twitter:card"]' : "tw_card",
'meta[name="twitter:site"]' : "tw_site",
'meta[property="og:url"]' : "og_url",
'meta[property="og:site"]' : "og_site",
'meta[property="og:title"]' : "og_title",
'meta[property="og:description"]' : "og_desc",
'meta[property="og:image"]' : "og_image",
'meta[property="twitter:image" ]' :"tw_image"
}
result = {v:soup.select_one(k)['content'] if(soup.select_one(k)) else "hoge" for k,v in meta_list.items()}
return {
'statusCode': 200,
'body': json.dumps(result)
}
ライブラリとまとめてzipにまとめる
アップロードするものをパッケージ化するために適当なディレクトリを作って作業します。
mkdir work
cd work
pip3 install requests -t ./
pip3 install beautifulsoup4 -t ./
cp ../lambda_funtion.py ./
zip -r upload.zip *
アクセス方法
API GatewayのところにAPIエンドポイントとしてURLができているのでそこにリクエストを投げれば結果が返ってくると思います。
ふにゃ最近出番がないの。。。
タイトルに入れてあげるから許して!
しょうがないな許してやるよ
enjoy