Lambda(Python3)でBoto3を利用時に「Unknown service: ‘xxxxx’」と表示された場合の対処法

2021.07.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。

LambdaでBoto3を利用していると「Unknown service: 'xxxxx'」というエラーが表示されて処理ができないときがあります。
今回は上記エラーが出た場合の対処方法を確認してみました。

エラーの原因

エラーの原因は下記2点が考えられます。

  • Boto3のclientでサービス名の入力間違い
  • Boto3のライブラリバージョンで該当のサービスがサポートされていない

前者の場合は、入力内容を修正すれば解決できるのですが、後者の場合は対応が必要になります。
LambdaにはBoto3があらかじめ導入されていて、利用者側で導入する必要がないようになっています、ただし導入されているBoto3のバージョンは最新でない場合がございます。
2021/7/8時点でLambda Python3では「boto3-1.17.42」となっています。
最新のBoto3は「boto3-1.17.106」なので、バージョンの違いによりサポートされるサービスに違いがあります。

■ Lambda ランタイム
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

■ Boto3 documentation
https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

比較をすると下記サービスが「boto3-1.17.42」でサポートされていないことがわかりました。

  • accessanalyzer
  • applicationcostprofiler
  • apprunner
  • finspace
  • finspace-data
  • lookoutequipment
  • mgn
  • nimble
  • proton
  • ssm-contacts
  • ssm-incidents

該当のサービスに関する処理を行う場合は、Boto3のライブラリバージョンを上げる必要があります。
今回は、Lambda Layerを使って対応をしてみました。

前提条件

作業用のPCにPython3.8または3.7, 3.6 と pipが実行できる環境が必要になります。

作業前の確認

作業前にLambdaに設定されているBoto3のバージョンを確認いたします。
Lambdaで下記プログラムを入力してテストイベントを実行します。

import json
import botocore
import boto3

def lambda_handler(event, context):
    print('botocore vertion: {0}'.format(botocore.__version__))
    print('boto3 vertion: {0}'.format(boto3.__version__))

実行結果

Function Logs
START RequestId: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx Version: $LATEST
botocore vertion: 1.20.42
boto3 vertion: 1.17.42

boto3のバージョンが「1.17.42」であることを確認しました。

対応してみる

Lambda Layerに設定するBoto3の準備

Lambda Layerに設定する用に最新のBoto3を取得してZipファイルに圧縮をします。
作業はディレクトリを作成しておこないます。
boto3を取得すると関連するライブラリとしてbotocore, dateutil, jmespath, s3transfer, urllib3も取得されます。
全てのファイルを圧縮にて保存します。

現在、最新のBoto3をレイヤーに指定する場合は、Zip解凍時の直下のディレクトリ名は「python」にする必要があることがわかりました。
ディレクトリ名を変更するコマンドを下記追加しています。

% mkdir [作業用ディレクトリ]
% pip install -t ./[作業用ディレクトリ] boto3
% mv ./[作業用ディレクトリ] ./python
% zip -r boto3-1.17.106.zip ./python

Lambda Layerの設定

AWSマネージメントコンソールのサービスから[Lambda]をクリックします。
左メニューの[レイヤー]をクリックして、一覧上部の[レイヤーの作成]をクリックします。

Lambda Layerの設定1

レイヤー設定では、先ほど作成したZipファイル設定してその他項目を入力します。
入力後は[作成]をクリックします。

  • 名前 : boto3-1_17_106 ※任意
  • 説明 : Boto3 1.17.106 ※任意
  • 互換性のあるランタイム : Python 3.8, 3.7, 3.6

Lambda Layerの設定2

下記画面が表示されると登録は完了になります。

Lambda Layerの設定3

Lambda Layerの適用

登録したLambda LayerをLambda関数で利用できるように設定します。
対象関数の設定画面に移動をしてレイヤー項目の[レイヤー追加]をクリックします。

Lambda Layerの適用1

レイヤーの選択が表示されますので[カスタムレイヤー]を選択頂き、先ほど登録したレイヤーを選択します。
バージョンは初期登録の時点で1のみ選択できますのでそのまま指定します。
入力後は[追加]をクリックして登録を完了します。

Lambda Layerの適用2

上記でBoto3のライブラリのバージョン変更は完了になります。

作業後の確認

作業前にBoto3のライブラリバージョンを確認するプログラムを再度実行します。

実行結果

Function Logs
START RequestId: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx Version: $LATEST
botocore vertion: 1.20.106
boto3 vertion: 1.17.106

boto3のバージョンが「1.17.106」に変わっている事が確認できました。
上記で、エラーが表示されていたサービスも利用可能になります。

さいごに

今回はLambdaで「Unknown service: 'xxxxx'」のエラーが表示された場合の対処法を確認してみました。
少しでもお客様の作りたい物の参考になればと考えております。

変更履歴

・当初Python3.8の利用を想定していましたが、3.6, 3.7でも同等の対応にてboto3のバージョン変更ができることを確認できましたのでPythonの表示を「Python3」または「Python3.8または3.7, 3.6」に変更