【トラブル】【AWS】boto3 AWS Glue API のトラブル ~ trigger全般 編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/01/16/205331

が長くなり、別ケースの例外メッセージもあったので分冊。

今回は、boto3 AWS Glue API の trigger全般 のトラブルを纏める

目次

【1】create_trigger() コール時に例外が発生する
【2】create_trigger() コール時に例外「State cannnot be null or empty」が発生する
【3】get_trigger() 実行時 に例外「ThrottlingException」が発生する

【1】create_trigger() コール時に例外が発生する

create_trigger() を使用した際に、以下の「エラー内容」が表示された

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/glue.html#Glue.Client.create_trigger

エラー内容

Case1

botocore.exceptions.ClientError: An error occurred (InternalError)
 when calling the CreatTrigger operation (reached max retries: 4):
... 略 ...
TypeError: __init__() missing 1 required positional arguments: 'operation_name'

Case2

An error occurred (EntityNotFoundException)
 when calling the CreateTrigger operation: Entity not found

原因

create_trigger() の WorkflowName (関連付けるワークフロー名)の指定の仕方が間違っていた
(めちゃくちゃはまった。。。)

サンプル抜粋

response = client.create_trigger(
    Name='sample_trigger',
    WorkflowName='sample_workflow', # ★ここのワークフロー名が存在しない名前を指定していた★
    ....

解決策

WorkflowName を正しい指定にした

【2】create_trigger() コール時に例外「State cannnot be null or empty」が発生する

Crawlerイベント設定において、
create_trigger() コール時に以下の「エラー内容」が発生した。

例外には「State cannnot be null or empty」と記載されているが、
設定には、「State: 'SUCCEEDED'」が記載されている。

エラーが発生したYAMLファイル

Name: 'sample-trigger-for-crawler'
Description: 'This is a sample trigger for a crawler'
WorkflowName: 'sample-workflow'
Type: 'CONDITIONAL'
Predicate:
  Logical: 'ANY'
  Conditions:
    - LogicalOperator: 'EQUALS'
      CrawlerName: 'sample-crawler'
      State: 'SUCCEEDED'
Actions:
  - JobName: 'sample-job'
    Arguments:
      --success_param: '0'
StartOnCreattion: True
Tags:
  Name: 'sample-trigger-for-crawler'

エラー内容

An error occurred (InvalidInputException) when calling the CreateTrigger operation:
State cannnot be null or empty, choose from one of the following crawler state:
[SUCCEEDED, FAILED, CANCELLED]

原因

State: 'SUCCEEDED'
ではなく
CrawlState: 'SUCCEEDED'
だった

対応策

パラメータを修正

エラーが発生したYAMLファイル

Name: 'sample-trigger-for-crawler'
Description: 'This is a sample trigger for a crawler'
WorkflowName: 'sample-workflow'
Type: 'CONDITIONAL'
Predicate:
  Logical: 'ANY'
  Conditions:
    - LogicalOperator: 'EQUALS'
      CrawlerName: 'sample-crawler'
      CrawlState: 'SUCCEEDED'
Actions:
  - JobName: 'sample-job'
    Arguments:
      --success_param: '0'
StartOnCreattion: True
Tags:
  Name: 'sample-trigger-for-crawler'

【3】get_trigger() 実行時 に例外「ThrottlingException」が発生する

エラー内容

An error occurred (ThrottlingException)
 when calling the GetTrigger operation (reached max retries: 4): Rate exceeded

原因

ThrottlingException は、APIコールレートの上限を超過した場合に発生する。
(なので、『(reached max retries: 4): Rate exceeded』って書いてある)

対応策

リトライする。(以下のサンプルを参照)

サンプル

import boto3
try:
    from botocore.exceptions import BotoCoreError, ClientError
except ImportError:
    pass

MAX_RETRY_COUNT = 20
WAIT_TIME_FOR_RETRY = 15

def has_trigger(glue_client, trigger_name, retry_count=1):

    has_workflow = False
    try:
        response = glue_client.get_trigger(
            Name=trigger_name)
        has_workflow = True
    except(BotoCoreError, ClientError) as ex:
        error_code = ex.response['Error']['Code']
        if error_code == 'EntityNotFoundException':
            has_workflow = False
        elif error_code == 'ThrottlingException':
            if retry_count < MAX_RETRY_COUNT:
                print("Throttling Exception Occured. Attempt No.: " + str(tries))
                time.sleep(WAIT_TIME_FOR_RETRY)
                return has_trigger(glue_client, trigger_name, retry_count + 1)
            else:
                print("Attempted {} Times But No Success.".format(MAX_RETRY_COUNT))
                raise ex
        else:
            raise ex

if __name__ == '__main__':
    glue_client = boto3.client('glue')
    target_trigger_name = 'YOUR_TRIGGER_NAME'
    print('Exists the trigger [{}] : [{}]'.format(
         target_trigger_name, has_trigger(glue_client, target_trigger_name)))

参考文献

https://stackoverflow.com/questions/30104286/throttlingexception-aws-api

関連記事

boto3 AWS Glue API のトラブル ~ scheduled trigger編 ~
https://dk521123.hatenablog.com/entry/2020/01/16/205331
AWS Glue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/01/221926
AWS Glue ~ Boto3 / 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/14/000000
AWS Glue ~ Boto3 / 基本編 ~
https://dk521123.hatenablog.com/entry/2021/04/17/001930
AWS Glue ~ Boto3 / クローラ編 ~
https://dk521123.hatenablog.com/entry/2021/04/16/135558
boto3 AWS Glue API のトラブル ~ scheduled trigger編 ~
https://dk521123.hatenablog.com/entry/2020/01/16/205331
boto3 AWS Glue API のトラブル ~ job/crawler編 ~
https://dk521123.hatenablog.com/entry/2020/02/05/223307
AWS Glue のトラブル ~ job編 - [1] ~
https://dk521123.hatenablog.com/entry/2019/10/25/232155
AWS Glue のトラブル ~ job編 - [2] ~
https://dk521123.hatenablog.com/entry/2020/10/12/152659
AWS Glue のトラブル ~ job編 - [3] ~
https://dk521123.hatenablog.com/entry/2021/02/16/145848
AWS Glue のトラブル ~ crawler編 ~
https://dk521123.hatenablog.com/entry/2020/05/07/144132