AWS でのカスタマイズ可能な外部関数の作成

このドキュメントでは、Amazon Web Services(AWS)クラウドプラットフォームで次を含む外部関数を作成する方法の1つを示しています。

  • リモートサービスの作成(AWSのLambda関数)。

  • プロキシサービスの作成(Amazon API Gateway上)。

  • Snowflakeでの API 統合の作成。

  • Snowflakeでの外部関数の作成。

  • 外部関数の呼び出し。

これらの手順では、AWSの管理にすでに精通していることを前提としています。これらの手順では、実行する必要のある一般的なステップを指定しますが、AWS管理コンソールの詳細については、詳細が変更される可能性があるため説明しません。

このトピックの内容:

前提条件

必須:

  • 次の権限を含む、 AWS のアカウント。

    • IAMを介したAWSロールの作成(IDおよびアクセス管理)。

    • AWS Lambda関数の作成。

    • API Gatewayエンドポイントの作成。

  • ACCOUNTADMIN 権限または CREATE INTEGRATION 権限があるロールを持っているSnowflakeアカウント。

このドキュメントは、経験豊富な AWS 管理者を前提としています。

ちなみに

外部関数の作成中、認証関連の情報をSnowflakeから AWS に、そして AWS からSnowflakeにコピーする必要があります。

以下の手順を実行する際に、後のステップで使用するため、以下のワークシートに情報を記録することをお勧めします。

AWS Account ID.............: _____________________________________________
Lambda Function Name.......: _____________________________________________
New IAM Role Name..........: _____________________________________________
New IAM Role ARN...........: _____________________________________________
Snowflake VPC ID (optional): _____________________________________________
New API Name...............: _____________________________________________
API Gateway Resource Name..: _____________________________________________
Resource Invocation URL....: _____________________________________________
Method Request ARN.........: _____________________________________________
API_AWS_IAM_USER_ARN.......: _____________________________________________
API_AWS_EXTERNAL_ID........: _____________________________________________

ステップ1: リモートサービスを作成する( AWS のLambda関数)

リモートサービスを作成するには、複数の方法があります。このセクションでは、 AWS Lambdaで実行されるPython関数として実装されるリモートサービスを作成する方法を示します。

このサンプルPython言語関数は、単にその入力を返します。

この関数は、Snowflakeが送信し、読み取る形式と同じ形式(JSON)でデータを受け入れ、返します。

このPython関数は、 eventcontext の2つのパラメーターを受け取ります。 event パラメーターには多くのサブフィールドが含まれ、そのうちの1つは body です。本文は data という名前のキーを含む辞書です。 data の対応する値は、Snowflakeが JSON 形式で送信したデータを保持する文字列です。AWS Lambdaは、Snowflakeから送信された HTTP POST リクエストを便利に処理し、本文を抽出してイベントパラメーターの本文を渡すため、このサンプル関数は HTTP POST リクエスト全体を解析する必要がありません。

このPython関数が本文を文字列として抽出した後、関数は JSON ライブラリ関数を呼び出して文字列をPythonデータ構造に変換します。次に、関数はそのデータ構造から個々の行を抽出し、それらを処理して、それぞれの値を返します。

AWS Lambda関数からの一般的な戻り値の JSON は次のようになります。

{
"statusCode": <http_status_code>,
"body":
        {
            "data":
                  [
                      [ 0, <value> ],
                      [ 1, <value> ]
                      ...
                  ]
        }
}

戻り値のデータは、入力データについて前述した形式と一致します。AWS では、 HTTP と互換性のあるサービスの規則は、 JSON オブジェクト内に本文を返すことです。これには、 HTTP ステータスコードも含まれます。

この AWS Lambda関数を作成するには、次のステップに従います。

  1. AWS マネジメントコンソールにログインします(まだログインしていない場合)。

  2. 上記のワークシートに AWS アカウント ID を記録します。

    AWS アカウント ID を検索する必要がある場合は、 AWS の手順 に従ってください。

  3. 「Lambda」を選択します。

  4. 「関数の作成」を選択します。

  5. 関数名を入力します。

    上記のワークシートの「Lambda関数名」という行にこの名前を記録します。

  6. 使用する言語を選択します。この例では、Python 3.7を選択します。

  7. この機能の実行ロールを選択または作成します。

    適切なオプションを選択します。通常は、「基本的なLambda権限で新しいロールを作成する」です。

    (このロールは、クラウドアカウントのロールおよびSnowflakeのロールとは別。)

  8. Create Function ボタンをクリックします。

  9. lambda_function タブで、関数のコードを入力します。独自の関数をまだ作成していない場合は、デフォルトの関数コードを入力がエコーされる以下のコードで置換できます。カスタム関数を作成する準備ができたら、後でこのコードを置換または更新できます。

    このサンプルコードは、 API Gatewayエンドポイントを作成 するための手順内でSnowflakeが推奨するように、Lambdaプロキシ統合を使用していることを前提としています。

    編集ウィンドウに貼り付けることができない場合は、関数のファイル名をダブルクリックして編集を有効にしてみます。

    import json
    
    def lambda_handler(event, context):
    
        # 200 is the HTTP status code for "ok".
        status_code = 200
    
        # The return value will contain an array of arrays (one inner array per input row).
        array_of_rows_to_return = [ ]
    
        try:
            # From the input parameter named "event", get the body, which contains
            # the input rows.
            event_body = event["body"]
    
            # Convert the input from a JSON string into a JSON object.
            payload = json.loads(event_body)
            # This is basically an array of arrays. The inner array contains the
            # row number, and a value for each parameter passed to the function.
            rows = payload["data"]
    
            # For each input row in the JSON object...
            for row in rows:
                # Read the input row number (the output row number will be the same).
                row_number = row[0]
    
                # Read the first input parameter's value. For example, this can be a
                # numeric value or a string, or it can be a compound value such as
                # a JSON structure.
                input_value_1 = row[1]
    
                # Read the second input parameter's value.
                input_value_2 = row[2]
    
                # Compose the output based on the input. This simple example
                # merely echoes the input by collecting the values into an array that
                # will be treated as a single VARIANT value.
                output_value = ["Echoing inputs:", input_value_1, input_value_2]
    
                # Put the returned row number and the returned value into an array.
                row_to_return = [row_number, output_value]
    
                # ... and add that array to the main array.
                array_of_rows_to_return.append(row_to_return)
    
            json_compatible_string_to_return = json.dumps({"data" : array_of_rows_to_return})
    
        except Exception as err:
            # 400 implies some type of error.
            status_code = 400
            # Tell caller what this function could not handle.
            json_compatible_string_to_return = event_body
    
        # Return the return value and HTTP status code.
        return {
            'statusCode': status_code,
            'body': json_compatible_string_to_return
        }
    
  10. Deploy ボタンをクリックして、関数を展開します。

  11. オプションですが、強くお勧めします。関数をテストします。

    Snowflakeが提供するサンプルPython関数の場合、次のテストデータを使用します(デフォルトのデータを以下のデータで置換)。

    {
      "body":
        "{ \"data\": [ [ 0, 43, \"page\" ], [ 1, 42, \"life, the universe, and everything\" ] ] }"
    }
    

    実行結果は次のようになります。

    Response:
    {
      "statusCode": 200,
      "body": "{\"data\": [[0, [\"Echoing inputs:\", 43, \"page\"]], [1, [\"Echoing inputs:\", 42, \"life, the universe, and everything\"]]]}"
    }
    ...
    

上記が正しく機能していれば、外部関数のリモートサービスとして使用できる AWS Lambda関数ができました。

ステップ2:プロキシサービス(Amazon API Gateway)を構成し、 API 統合を(Snowflakeで)作成する

Amazon API Gatewayをプロキシサービスとして設定するには、次を含むいくつかの手順が必要です。

  • AWS アカウントに新しい IAM ロールを作成します。

  • Amazon API Gatewayエンドポイントを作成し、構成します。

  • Amazon API Gatewayエンドポイントを保護します。

  • Snowflakeで API 統合オブジェクトを作成します。

  • Snowflakeと新しい IAM ロールの間に信頼関係を設定します。

API 統合には API Gateway(ロールの ARN (Amazonリソースネーム))からの情報が必要であり、 API Gatewayには API 統合からの情報(API_AWS_EXTERNAL_ID および API_AWS_IAM_USER_ARN)が必要であるため、これらを作成するステップはインターリーブされます。

AWS アカウントでの新しい IAM ロールの作成

Snowflakeが AWS アカウントを認証するには、Snowflakeが所有する IAM (IDおよびアクセス管理)ユーザーに、 AWS アカウントで IAM ロールを引き受ける権限を付与する必要があります。これを実行するには、信頼関係を確立する必要があります。信頼関係を確立するには、 AWS アカウントに IAM ロールを作成し、Snowflakeが所有する IAM ユーザーの ARN で構成する必要があります。また、Snowflakeに API 統合オブジェクトを作成し、 API 統合オブジェクトに、どの IAM ロールを引き受けるかに関する情報を設定する必要があります。

  1. 新しい IAM ロールを作成します。

  2. 信頼できるエンティティのタイプを選択するように求められたら、「別の AWS アカウント」を選択します。

  3. 「このロールを使用できるアカウントを指定してください」というメッセージが表示されたら、上記のワークシートから以前に保存した AWS アカウント ID を貼り付けます。

  4. 「次へ: 権限」をクリックします。

  5. 必要に応じて、権限(「権限ポリシーの添付」)を設定します。

  6. ロール名を入力します。

    • ロール名を「新しい IAM ロール名」として記録します。

  7. Create role ボタンをクリックします。ロールを作成した後、

    • 上記のワークシートで、「ロール ARN」を「新しい IAM ロール ARN」として記録します。

Amazon API Gatewayでの API の作成および構成

エンドポイントの選択: 地域エンドポイント対プライベートエンドポイント

URI を介してプロキシサービス(Amazon API Gatewayなど)にアクセスします。これは「エンドポイント」と呼ばれることがあります。Amazon APIゲートウェイの場合、次のいずれかを作成できます。

  • 地域エンドポイント。

  • プライベートエンドポイント。

地域エンドポイントは、地域間またはクラウド間でもアクセスできます。Snowflakeインスタンス、プロキシサービス、およびリモートサービスのすべてが、異なる地域、あるいは異なるクラウドプラットフォームでも利用できます。たとえば、Azureで実行されているSnowflakeインスタンスは、Amazon API Gatewayの地域エンドポイントにリクエストを送信できます。これにより、GCPで実行されているリモートサービスにデータが転送されます。

プライベートエンドポイントは、 PrivateLink 経由で同じ AWS 地域内のSnowflake VPC (仮想プライベートクラウド)からのみアクセスを許可するように構成できます。

AWS にあるさまざまなタイプのエンドポイントの詳細については、次をご参照ください。

プライベートエンドポイントを使用する必要があり、使用している地域がわからない場合は、次のいずれかを実行して地域を検索できます。

  • SQL 関数 CURRENT_REGION() を呼び出します(例: SELECT CURRENT_REGION())。

  • Snowflakeアカウントのホスト名を確認します。これは通常、クラウドプロバイダーと地域を表します。アカウントのホスト名、地域、およびクラウドプロバイダーの詳細については、 サポートされている地域 をご参照ください。

プライベートエンドポイントを使用するには、アカウントが次の要件を満たしている必要があります。

  • SnowflakeのBusiness Critical(またはそれ以上の)エディション。

AWSでは、SnowflakeはSnowflakeアカウントのAWS VPCsへの接続をサポートしています。プライベートエンドポイントは、PrivateLinkを介したVPCs(仮想プライベートクラウド)間の通信を可能にします。SnowflakeとAWS PrivateLinkの詳細については、以下をご参照ください。

API Gatewayエンドポイントの作成

API Gatewayを作成および構成する前に、地域エンドポイントとプライベートエンドポイントのどちらを使用するかを選択します。詳細については、 エンドポイントの選択: 地域エンドポイント対プライベートエンドポイント をご参照ください。

注釈

AWS 以外でホストされているSnowflakeのインスタンスで、外部関数を作成できます。仮想ウェアハウスがAzureまたは GCP (Google Cloud Platform)上にある場合は、Amazon API Gatewayを介して、リモートサービスにアクセスする外部関数を作成できます。

API Gatewayエンドポイントを作成するステップは次のとおりです。

  1. プライベートエンドポイントを使用する場合は、Snowflakeウェブインターフェイスで次のコマンドを実行してVPC(仮想プライベートクラウド)IDを取得します。

    select system$get_snowflake_platform_info();
    

    出力は次のようになります。

    {"snowflake-vpc-id":["vpc-12345699"]}
    

    上記のワークシートの「Snowflake VPC ID」フィールドに VPC ID (例: 「vpc-12345699」)を記録します。

    (注: VPC エンドポイント ID ではなく、 VPC ID を使用する必要があります。VPC エンドポイント IDs は時間の経過とともに変化する可能性があります。)

  2. AWS 管理コンソールで、 API Gateway を選択します。

  3. Create API を選択します。

  4. エンドポイントのタイプ(地域またはプライベート)を選択します。

    • 地域 エンドポイントを選択する場合は、次のようにします。

      • REST API を探し、 Build ボタンをクリックします。

    • プライベート エンドポイントを選択する場合は、次のようにします。

      • REST API private を探し、 Build ボタンをクリックします。

    重要

    REST API または REST API private を選択してください。HTTP API または他のオプションを選択しないでください。

  5. New API オプションを選択します。

  6. 新しい API の名前を入力します。

    この名前を「新しい API 名」としてワークシートに記録します。

  7. Endpoint Type を選択するように求められた場合は、 Regional または Private のいずれかを選択します。

  8. プライベートエンドポイントを作成する場合は、ワークシートの「Snowflake VPC ID」フィールドに記録されているSnowflake VPC IDを入力します。

    (プライベートエンドポイントを作成していない場合は、 VPC ID を入力する必要はありません。)

  9. Create API ボタンをクリックします。

    これにより、リソースを作成できる新しい画面が表示されます。

  10. リソースを作成します。

    Create Resource オプションを表示するには、 Actions ボタンをクリックする必要がある場合があります。)

    リソース名を「API Gatewayリソース名」としてワークシートに記録します。後で必要になります。

    Create Resource ボタンをクリックすると、画面には No methods defined for the resource. と表示されます。

  11. 新しいメソッドを作成します。Actions をクリックし、このリソースに対して Create Method を選択します。

    POST オプションを指定します。(POST オプションが表示されない場合は、リソース名の下にある小さなドロップダウンメニューボックスをクリックしてください。)

    これにより、 Integration type およびその他のオプションを示す新しいウィンドウペインが表示されます。

  12. Integration typeLambda Function である必要があります。それがまだ選択されていない場合は、それを選択します。

  13. Use Lambda Proxy integration チェックボックスをクリックします。

    Lambdaプロキシ統合を選択することは重要です。Lambdaプロキシ統合なしの JSON は、Lambdaプロキシ統合がある JSON とは異なります。Lambdaプロキシ統合の詳細については、以下の AWS ドキュメントをご参照ください。

  14. Lambda Function フィールドに、ワークシートに記録したLambda関数名を貼り付けます。

  15. 保存します。

  16. Actions ボタンをクリックして、 Deploy API アクションを選択します。

  17. この関数のステージを選択または作成します。

  18. リソース名の下に、 POST が表示されます。

    これが表示されない場合は、リソース名の左側にある三角形をクリックして、リソースツリーを展開する必要が生じる場合があります。

  19. POST をクリックし、ワークシートの「リソース呼び出し URL」フィールドに POST リクエストの Invoke URL を記録します。

    呼び出し URL に、作成したリソースの名前が含まれていることを確認します。含まれていない場合は、リソースではなくステージの呼び出し URL をクリックした可能性があります。

  20. Save Changes をクリックします。

Amazon API Gatewayエンドポイントの保護

Amazon API Gatewayエンドポイントといった、プロキシサービスエンドポイントの保護の概要については、 プロキシサービスエンドポイントの保護 をご参照ください。

Amazon API Gatewayエンドポイントのセキュリティを保護するには、

  1. この時点で、 API Gateway情報を表示する画面が表示され、リソースと「POST」メソッドが表示されます。

    まだそこにいない場合は、次のようにします。

    1. AWS ウェブインターフェイスで、API Gatewayページに移動します。

    2. まだ選択していない場合は、API Gatewayを選択します。

    3. 左側のペインで、 Resources をクリックします。

    4. POST メソッドをクリックします。(これが表示されない場合は、 Resources ペイン(通常は左から2番目のペイン)でリソースの左側にある三角形をクリックして、リソースツリーを展開します。)

  2. メソッドリクエスト ARN を Method Request ボックスから上記のワークシートの「メソッドリクエスト ARN」フィールドにコピーします。

  3. タイトル Method Request をクリックします。

  4. Method RequestAWS_IAM 認証が必要であることを指定します。

    ドロップダウンメニューから AWS_IAM 認証を選択した後、メニューの横にある小さなチェックマークをクリックして、選択を確認する必要があることに注意してください。

  5. API Gatewayのリソースポリシーを設定して、ゲートウェイエンドポイントを呼び出すことができるユーザーを指定します。

    リソースポリシーを入力できる編集ウィンドウにアクセスするには、ウィンドウの左側の列にある API の Resource Policy をクリックする必要がある場合があります。

    • 地域エンドポイント:

      以下のリソースポリシーテンプレートをリソースポリシーエディターに貼り付けてから、以下で説明するように、プレースホルダーをワークシートの適切な値に置き換えます。

      {
          "Version": "2012-10-17",
          "Statement":
          [
              {
              "Effect": "Allow",
              "Principal":
                  {
                  "AWS": "arn:aws:sts::<12-digit-number>:assumed-role/<external_function_role>/snowflake"
                  },
              "Action": "execute-api:Invoke",
              "Resource": "<method_request_ARN>"
              }
          ]
      }
      

      リソースポリシーの次の部分を置き換えます。

      • <12桁の数字> をワークシートに記録した AWS アカウント ID に置き換えます。

      • <外部関数ロール> を新しい IAM ロール名からのロール名に置き換えます。

        たとえば、AWSのロール名が次の場合、

        arn:aws:iam::987654321098:role/MyNewIAMRole
        

        結果は次のようになります。

        "AWS": "arn:aws:sts::987654321098:assumed-role/MyNewIAMRole/snowflake"
        
      • リソースの POST メソッドの「リソース」をメソッドリクエスト ARN に設定する必要があります。

        注釈

        リソースをメソッドリクエスト ARN に設定すると、 API Gatewayは指定されたリソースへの呼び出しのみを許可するように指定します。メソッドリクエスト ARN のサブセットをプレフィックスとして指定できます。これにより、同じ API Gatewayから複数のリソースを呼び出すことができます。

        たとえば、メソッドリクエスト ARN が次の場合、

        arn:aws:execute-api:us-west-1:123456789012:a1b2c3d4e5/*/POST/MyResource
        

        次のプレフィックスのみを指定できます。

        arn:aws:execute-api:us-west-1:123456789012:a1b2c3d4e5/*/
        
    • プライベートエンドポイント:

      以下のリソースポリシーテンプレートをリソースポリシーエディターに貼り付けてから、以下で説明するように、プレースホルダーをワークシートの適切な値に置き換えます。

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:sts::<12-digit-number>:assumed-role/<external_function_role>/snowflake"
                  },
                  "Action": "execute-api:Invoke",
                  "Resource": "<method_request_ARN>",
                  "Condition": {
                      "StringEquals": {
                          "aws:sourceVpc": "<VPC_ID>"
                      }
                  }
              }
          ]
      }
      

      リソースポリシーの次の部分を置き換えます。

      • 地域のエンドポイントについて、上記のように <12桁の数字><外部関数ロール><メソッドリクエスト ARN> を置き換えます。

      • 「<VPD_ID>」をご使用の地域のSnowflake VPC ID に置き換えます。これは、ワークシートの「Snowflake VPC ID」フィールドに記録する必要があります。

  6. リソースポリシーを保存するために Save をまだクリックしていない場合は、ここでクリックしてください。

  7. 更新された API を展開します。

次のいくつかのステップでは、Snowflake API 統合オブジェクトを作成します。ここで AWS 管理ウィンドウを閉じないでください。後で戻る必要があります。

SnowflakeでのAPI統合オブジェクトの作成

  1. Snowflakeセッションを開きます(まだ開いていない場合)。通常はSnowflakeウェブインターフェイスセッションです。

  2. ACCOUNTADMIN権限またはCREATE INTEGRATION権限を持つSnowflakeロールを使用します。次に例を示します。

    use role has_accountadmin_privileges;
    
  3. CREATE API INTEGRATION コマンドを入力して、 API 統合を作成します。コマンドは次のようになります。

    CREATE OR REPLACE API INTEGRATION my_api_integration_01
      api_provider = aws_api_gateway
      api_aws_role_arn = '<new_IAM_role_ARN>'
      api_allowed_prefixes = ('https://')
      enabled = true
    ;
    

    コマンドをカスタマイズします。

    • プライベートエンドポイントを使用している場合、api_providerは「aws_private_api_gateway」にする必要があります。それ以外の場合、api_providerは「aws_api_gateway」にします。

    • <新規 IAM ロール ARN> は、上記のワークシートで以前に記録した新しい IAM ロール ARN である必要があります。

    • api_allowed_prefixesフィールドには、以前に記録したリソース呼び出し URL が含まれている必要があります。

    • この例の値を使用するのではなく、 API 統合の名前をカスタマイズすることもできます。

    以下は、包括的な CREATE API INTEGRATION ステートメントの例です。

    create or replace api integration demonstration_external_api_integration_01
        api_provider=aws_api_gateway
        api_aws_role_arn='arn:aws:iam::123456789012:role/my_cloud_account_role'
        api_allowed_prefixes=('https://xyz.execute-api.us-west-2.amazonaws.com/production/')
        enabled=true;
    
  4. 上で入力した CREATE API INTEGRATION コマンドを実行します。

  5. DESCRIBE INTEGRATION コマンドを実行します。

    DESCRIBE INTEGRATION <my_integration_name>;
    

    例:

    DESCRIBE INTEGRATION my_api_integration_01;
    
  6. 「API_AWS_IAM_USER_ARN」という名前のプロパティを探し、そのプロパティのプロパティ値をワークシートに記録します。

  7. 「API_AWS_EXTERNAL_ID」という名前のプロパティを探し、そのプロパティのプロパティ値をワークシートに記録します。

    API_AWS_EXTERNAL_ID のプロパティ値は、しばしば等号(「=」)で終わることに注意してください。その等号は値の一部です。プロパティ値の残りの部分と一緒に切り取って貼り付けてください。

次のいくつかのステップでは、 AWS の管理ウィンドウに戻ります。ここでSnowflake管理ウィンドウを閉じないでください。後で戻る必要があります。

Snowflakeと新しい IAM ロールの間における信頼関係の設定

AWS 管理コンソールで、

  1. IAM を選択します。

  2. ロールを選択します。

  3. 以前に作成して記録した新しい IAM ロール名を探して選択します。

  4. 「信頼関係」タブ、 Edit trust relationship ボタンの順にクリックします。

    これにより、認証情報を追加できるポリシードキュメントが開きます。

  5. ポリシードキュメントで、Statement.Principal.AWS フィールドを見つけ、値(キーではなく)を以前に保存した API_AWS_IAM_USER_ARN に置き換えます。

  6. Statement.Conditionフィールドを探します。最初は、中括弧(「{}」)のみが含まれているはずです。

  7. 中括弧の間に次を貼り付けます。 "StringEquals": { "sts:ExternalId": "xxx" }

  8. 「xxx」を先ほど記録した API_AWS_EXTERNAL_ID の値に置き換えます。

  9. 信頼関係の「ポリシードキュメント」の編集が完了すると、次のようになります。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::1234567898012:user/development/development_user"
          },
          "Action": "sts:AssumeRole",
          "Condition": {"StringEquals": { "sts:ExternalId": "EXTERNAL_FUNCTIONS_SFCRole=3_8Hcmbi9halFOkt+MdilPi7rdgOv=" }}
        }
      ]
    }
    
  10. Update Trust Policy をクリックします。

ステップ3: 外部関数を作成する

次に、Snowflake管理ウィンドウ(以前に CREATE API INTEGRATION コマンドを入力した場所)に戻ります。

  1. CREATE EXTERNAL FUNCTION コマンドを入力します。次のようになります。

    CREATE EXTERNAL FUNCTION my_external_function(n INTEGER, v VARCHAR)
        RETURNS VARIANT
        API_INTEGRATION = <api_integration_name>
        AS '<resource_invocation_url>'
        ;
    

    コマンドをカスタマイズします。

    • <api_integration_name> 値には、以前に作成した API 統合の名前が含まれている必要があります。

    • <resource_invocation_url> 値は、ワークシートに記録したリソース呼び出し URL である必要があります。この URL には、ステージ名だけでなく、 API Gatewayリソース名が含まれていることを確認してください。

    • 関数名をカスタマイズすることもできます。

    この例では2つの引数( INTEGER と VARCHAR)を渡します。これらの引数は、Lambda関数が期待する引数だからです。独自のLambda関数を作成するときは、Lambda関数に適切な引数を渡す必要があります。

  2. 上記で入力した CREATE EXTERNAL FUNCTION コマンドをまだ実行していない場合は、ここで実行してください。

ステップ4:外部関数を呼び出す

  1. 必要に応じて、外部関数の USAGE 権限を1つ以上のSnowflakeロールに付与し、それらのロールが外部関数を呼び出せるようにします。(ロールには、その外部関数に対する USAGE または OWNERSHIP 権限が必要。)

  2. 次を呼び出して関数を実行します。

    SELECT my_external_function(99, 'Luftballoons');
    

    CREATE EXTERNAL FUNCTION コマンドで関数名をカスタマイズした場合は、「使用する外部関数」をカスタマイズした名前に置き換えます。

AWS で外部関数を構築するための追加リソース

Lambda関数に基づくリモートサービスの追加の例は、次の場所で入手できます。

トラブルシューティング

一般的な外部機能のトラブルシューティングドキュメント もご参照ください。

Unable to read the requests body inside the Amazon AWS Lambda Function

症状:

関数は、 HTTP POST メソッドのリクエスト本文を読み取ることができません。

考えられる原因:

Lambdaプロキシ統合を有効にしていない可能性があります。

考えられる解決策:

Lambdaプロキシ統合を有効にします。

詳細については、 Amazon API Gatewayでの API の作成および構成 をご参照ください。

SQL execution error: Error assuming AWS_ROLE.Please verify the role and externalId are configured correctly in your AWS policy.

症状:

外部関数を呼び出そうとすると、次のエラーメッセージが表示される。

SQL execution error: Error assuming AWS_ROLE.Please verify the role and externalId are configured correctly in your AWS policy.

考えられる原因:

  • ロールの AWS 信頼関係ポリシーで、 AWS ARN が正しくありません。考えられる原因には、次が含まれます。

    • 設定されていない。

    • 設定されているが、Snowflakeの「DESCRIBE INTEGRATION」コマンドから確認できるユーザー ARN ではなく、 AWS ロールの ARN を使用(誤り)。API_AWS_ROLE_ARN ではなく API_AWS_IAM_USER_ARN を使用してください。

  • AWS 信頼関係ポリシーで、std:ExternalId が誤っている。考えられる原因には、次が含まれます。

    • 設定されていない。

    • API 統合オブジェクトを再作成した。APIオブジェクトを再作成すると、その外部IDが変更されます。

Error: 403 '{"Message":"User: <ARN> is not authorized to perform: execute-api:Invoke on resource: <MethodRequestARN>"}'

症状:

外部関数を呼び出そうとすると、次のエラーメッセージが表示される。

Request failed for external function <機能名>。エラー: 403 '{"メッセージ":"ユーザー: <ARN> is not authorized to perform: execute-api:Invoke on resource: <MethodRequestARN>"}'

考えられる原因:

  • API Gatewayリソースポリシーには次のものがあります。

    • 間違った IAM ロール ARN。

    • 間違って引き受けたロール。

    • 間違ったメソッドリクエスト ARN。

  • IAM ロールには適切なポリシーが添付されていません。

考えられる解決策:

  • Amazon API Gatewayエンドポイントの保護 のリソースポリシーテンプレートに従っていることを確認してください。具体的には、リソースポリシーについて次を確認してください。

    • <12桁の数字> をワークシートからの AWS アカウント ID に置き換えたこと。

    • <外部関数ロール> をワークシートからの新しい IAM ロール名に置き換えたこと。

    • Resource フィールドの method_request_ARN をメソッドリクエスト ARN に置き換えたこと。

  • IAM ロールに正しいアクセス許可ポリシーが添付されていることを確認する必要がある場合は、以下のステップに従って、ロールのアクセス許可ポリシーリストを見つけることができます。

    1. AWS で、ロールを選択します。

    2. ロールの Summary を表示します。

    3. Permissions タブをクリックします。

    4. 必要なポリシーが Permissions policies リストにあることを確認します。

Error: 403 '{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: <MethodRequestARN>"}'

症状:

外部関数を呼び出そうとすると、次のエラーメッセージが表示される。

Request failed for external function <機能名>。エラー: 403 '{"メッセージ":"ユーザー: この操作を行う権限がありません: execute-api:リソースの呼び出し: <MethodRequestARN>"}'

考えられる原因:

考えられる原因の1つには、 API Gatewayの承認を構成しているときに、 Method Request にはリソースの AWS_IAM 認証が必要であることを指定しなかった可能性があります。

考えられる解決策:

Amazon API Gatewayを保護する の手順に従わなかった場合は、今すぐそれに従って、 AWS_IAM 認証を指定してください。

"Error parsing JSON response for external function ... Error: top-level JSON object must contain "data" JSON array element"

考えられる原因:

  • API Gatewayリソースにラムダプロキシ統合を指定していない可能性があります。

考えられる解決策: