Closed5

WebAdapterを使ってLambdaでコンテナを動かす

IGUCHI KanahiroIGUCHI Kanahiro

https://github.com/awslabs/aws-lambda-web-adapter

コンテナイメージに、Lambda用のアダプターを取り込むだけで、Lambdaのための特別対応をしなくても任意のwebアプリケーションをLambdaで動かすことが出来るという、触れ込み。すると、ローカルでもLambdaでもECSでも動作するポータブルなコンテナになる、と。

IGUCHI KanahiroIGUCHI Kanahiro

上記を以下の方針で修正する

  • テスト用に北海道のデータだけで作成
  • WebAdapter対応
  • Valhallaが8002ポートを利用することを環境変数で設定(PORT=8002)
  • ヘルスチェック用エンドポイントを指定
FROM valhalla/valhalla:run-latest

COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.0 /lambda-adapter /opt/extensions/lambda-adapter
ENV PORT=8002
ENV READINESS_CHECK_PATH=/status

WORKDIR /app
RUN wget http://download.geofabrik.de/asia/japan/hokkaido-latest.osm.pbf
RUN mkdir -p valhalla_tiles
RUN valhalla_build_config --mjolnir-tile-dir ${PWD}/valhalla_tiles --mjolnir-tile-extract ${PWD}/valhalla_tiles.tar --mjolnir-timezone ${PWD}/valhalla_tiles/timezones.sqlite --mjolnir-admin ${PWD}/valhalla_tiles/admins.sqlite > valhalla.json
RUN valhalla_build_tiles -c valhalla.json hokkaido-latest.osm.pbf
RUN valhalla_build_extract -c valhalla.json -v
RUN rm hokkaido-latest.osm.pbf

EXPOSE 8002

CMD ["valhalla_service", "valhalla.json", "1"]
IGUCHI KanahiroIGUCHI Kanahiro
  • ビルドしたイメージをECRにアップロード
  • コンテナイメージを利用するLambdaを作成、アップロードしたイメージを指定
  • 関数URLを有効化

発行されるURLに下記のようにアクセスしてみる・結果が返ってくる

curl https://<your-lambda-function-url>.lambda-url.ap-northeast-1.on.aws/isochrone?json=%7B%22locations%22%3A%5B%7B%22lat%22%3A43.0744014%2C%22lon%22%3A141.3390508%7D%5D%2C%22costing%22%3A%22pedestrian%22%2C%22contours%22%3A%5B%7B%22time%22%3A15.0%2C%22color%22%3A%22ff0000%22%7D%5D%7D

{"features":[{"properties":{"fill-opacity":0.33,"fillColor":"#ff0000","opacity":0.33,"fill":"#ff0000","fillOpacity":0.33,"color":"#ff0000","contour":15,"metric":"time"},"geometry":{"coordinates":[[141.339051,43.083413],[141.337051,43.082810],[141.336051,43.082014],[141.335051,43.082184],[141.334208,43.081401],[141.334499,43.080401],[141.333107,43.079401],[141.332758,43.078109],[141.334051,43.077938],[141.334302,43.076653],[141.335123,43.076329],[141.332895,43.076245],[141.332490,43.077841],[141.331051,43.078287],[141.329400,43.076401],[141.329416,43.074401],[141.331051,43.071121],[141.334051,43.071201],[141.335311,43.071661],[141.337051,43.070194],[141.339348,43.069699],[141.340424,43.068401],[141.345051,43.067415],[141.347051,43.068870],[141.348470,43.068982],[141.349608,43.070401],[141.349596,43.071857],[141.351944,43.074401],[141.351166,43.075401],[141.347160,43.077510],[141.345011,43.080401],[141.345051,43.081468],[141.343033,43.082384],[141.340882,43.082232],[141.340051,43.083140],[141.339051,43.083413]],"type":"LineString"},"type":"Feature"}],"type":"FeatureCollection"}

※クエリパラメータはURLエンコードしておかないと動作しなかった
(ローカル環境ではそれでも動作した。https://github.com/awslabs/aws-lambda-web-adapter/issues/99 このあたりが関係ありそう。このように若干、挙動の違いがある)

IGUCHI KanahiroIGUCHI Kanahiro

注意点

  • アプリケーションがListenするポートは1024番以上じゃないとダメ(https://github.com/awslabs/aws-lambda-web-adapter/issues/249
    • 普通引っかからないが、80番を使っているアプリケーションを動かそうとして、少し詰まった
  • ヘルスチェックが完了できないと、アプリケーションが動作しない
  • メモリ512MBで、/isochrone処理を実行すると、非コールドスタート時は<200msで推移
    • (おそらく)コールドスタート時は<1秒程度、イメージのサイズは1.7GB
このスクラップは2023/07/30にクローズされました