【初めてのaws】aws lambdaでウェブサイトのmetaタグ取得APIを作る

thumbnail for this post

前回、Amazon Web Service(AWS)に登録したので、今回は早速サービスを作ってみたいと思います。
awsへの登録がまだの場合は前回の記事を見てください。

AWS Lambdaを使って作るサービス

今回作るのは下図のようなサービスです。

aws lambda メタタグ取得サービス

aws lambdaメタタグ取得サービス

ブログにはSNS(Twitter等)で貼り付けやすいようにメタタグというものが設定されています。(SNSでちゃんとシェアされるブログにする:metaタグ設定)

今回のサービスは「APIにURLを投げるとそのURLのページに設定されているog, twitterのメタタグをjson形式で取ってきてくれる」サービスです。

うまく使うと、記事にいろいろなブログを貼り付けられるようになるのでいろいろ便利になります。

aws lambda メタタグ取得サービス利用例

aws lambdaメタタグ取得サービス利用例

AWS Lambdaとは

AWS Lambdaとは世間的には「サーバレスアーキテクチャ」とか格好いい名前で呼ばれていますが要は「CGI」です。←怒られそう
レンタルサーバーにCGIのスクリプトをアップロードするのと違うところといえば、自動スケールしたり、堅牢だったりするところです。(無料枠内で結構遊べます)

AWS Lambda,API Gateway設定

awsコンソールにIAMユーザでログインして、サービスからLambdaを選び「関数の作成」ボタンをクリックします。
関数の作成オプションは「一から作成」を選んで、基本的な情報を下の画面のように設定します。

aws lambda設定

aws lambda設定


作成できたら、トリガーを追加をクリックします。
aws lambdaトリガー設定

aws lambdaトリガー設定


トリガーは「API Gateway」を選択します。
aws API gateway設定

aws API gateway設定


ここまでで形的には最初に載せたアーキテクチャの図のようになったはずです。
aws lambdaアーキテクチャ図

aws lambdaアーキテクチャ図

AWS Lambdaプログラミング

作成したLambda関数の箱をクリックすると下にスクリプトを書くためのエディタ画面が出てきます。

aws lambdaスクリプトエディタ

aws lambdaスクリプトエディタ

ライブラリを何も使わないならこのまま書けば良いのですが、ライブラリを使う場合は「.zipファイルをアップロード」メニューでライブラリまるごとアップロードする必要があります。

aws lambda zipアップロード

aws 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 *
出来上がったzipをアップロードすると自動的にデプロイしてくれます。

アクセス方法

API GatewayのところにAPIエンドポイントとしてURLができているのでそこにリクエストを投げれば結果が返ってくると思います。

ふにゃ最近出番がないの。。。

タイトルに入れてあげるから許して!

しょうがないな許してやるよ

enjoy
投げ銭していただける場合は、amazonで15円からできます。宛先はheisakuあっとcomichi.comで。

マイナスは入れられないの?

comments powered by Disqus