LoginSignup
5
6

More than 1 year has passed since last update.

SQS(FIFO) - Lambda構成の備忘録

Last updated at Posted at 2022-11-21

SQS(FIFO) - Lambda構成の備忘録

AWS歴5-6年なのにSQSを一度も触ったことがなく。。。
AssociateやPro資格は全て取得したので、多少のドキュメントレベルの知識ならあると思うんですが。
触る経験がないことが心残りでした。

そんな中、やっとSQSのキュートリガーを使ったLambdaの構成を検証する機会が舞い降りたので!
自分の備忘録がてらにメモを残します。

構成

screenshot.78.jpg

CFnコード(yaml)

IAM Role

AWSTemplateFormatVersion: '2010-09-09'
Description: [TEST] IAM Role for Lambda.
Parameters:
  RoleName:
    Type: String
    Default: test-lambdarole

Resources:
  LambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole
        - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
      RoleName: !Ref RoleName
      Tags:
        - Key: Name
          Value: !Ref RoleName

SQS

AWSTemplateFormatVersion: '2010-09-09'
Description: [TEST] FIFO SQSQueue, DLQ

Parameters:
  QueueName:
    Type: String
    Description: SQS Name
    Default: test-sqs.fifo
  DLQName:
    Type: String
    Description: SQS Name
    Default: test-dlq.fifo

Resources:
  SQS:
    Type: AWS::SQS::Queue
    Properties:
      ContentBasedDeduplication: true
      DeduplicationScope: queue
      FifoQueue: true
      FifoThroughputLimit: perQueue
      QueueName: !Ref QueueName
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt SQSDLQueue.Arn
        maxReceiveCount: 1
      Tags:
      - Key: Name
        Value: !Red QueuName
      VisibilityTimeout: 300
    DependsOn: SQSDLQueue01

  SQSPolicy:
    Type: AWS::SQS::QueuePolicy
    Properties: 
      PolicyDocument:
        Version: '2008-10-17'
        Id: __default_policy_ID
        Statement:
          - Sid: __owner_statement
            Effect: Allow
            Principal:
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
            Action: SQS:*
            Resource: !GetAtt SQS.Arn
      Queues: 
        - !GetAtt SQS.QueueName
    DependsOn: SQS

  SQSDLQueue:
    Type: AWS::SQS::Queue
    Properties:
      ContentBasedDeduplication: false
      DeduplicationScope: queue
      FifoQueue: true
      FifoThroughputLimit: perQueue
      QueueName:  sqs-dlq.fifo
      RedriveAllowPolicy:
        redrivePermission: allowAll
      Tags:
      - Key: Name
        Value: !Red DLQName
      VisibilityTimeout: 300

  SQSDLQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      PolicyDocument:
        Version: '2008-10-17'
        Id: __default_policy_ID
        Statement:
          - Sid: __owner_statement
            Effect: Allow
            Principal:
              AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
            Action: SQS:*
            Resource: !GetAtt SQSDLQueue.Arn
      Queues:
        - !GetAtt SQSDLQueue.QueueName
    DependsOn: SQSDLQueue
Outputs:
  SQS:
    Description: ARN of the SQS Queue we created
    Value:
      !GetAtt SQS.Arn
  SQSDLQueue:
    Description: ARN of the SQS Dead-letter Queue we created
    Value:
      !GetAtt SQSDLQueue.Arn

Lambda

AWSTemplateFormatVersion: '2010-09-09'
Description: [TEST] Queu Trigger Lambda
Parameters:
  SubnetID01:
    Type: String
    Default: ''
  SecurityGroupID:
    Type: String
    Default: ''
  LambdaName:
    Type: String
    Default: test-lambda
  S3BucketName:
    Type: String
    Default: test-dammycode-s3
  SQSName:
    Type: String
    Default: test-sqs.fifo
  RoleName:
    Type: String
    Default: test-lambdarole

Resources:
  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: !Red LambdaName
      Runtime: java11
      Handler: lambda_function.lambda_handler
      Timeout: 50
      PackageType: Zip
      Code:
        S3Bucket: !Red S3BucketName
        S3Key: dammy_lambdacode.zip
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/${RoleName}
      VpcConfig: 
        SubnetIds: 
          - !Ref SubnetID01
        SecurityGroupIds: 
          - !Ref SecurityGroupID
      Tags:
        - Key: Name
          Value: !Ref LambdaName

  LambdaPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref Lambda
      Action: lambda:InvokeFunction
      Principal: sqs.amazonaws.com
      SourceAccount: !Ref AWS::AccountId
      SourceArn: !Sub arn:aws:sqs:ap-northeast-1:${AWS::AccountId}:${SQSName}

  LambdaEventSourceMapping:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      EventSourceArn: !Sub arn:aws:sqs:ap-northeast-1:${AWS::AccountId}:${SQSName}
      FunctionName: !GetAtt Lambda.Arn
      BatchSize: "10"
      Enabled: true
    DependsOn: Lambda

処理時間やバッチサイズに関する備忘録

  • 可視性タイムアウト
    可視性タイムアウトは、処理されたメッセージを見えないようにする時間で、重複処理防止の為のもの
  • 可視性タイムアウトの処理時間とLambdaの実行時間の関係
    可視性タイムアウトの処理時間はLambdaの実行時間の6倍の時間を設定することがAWSより推奨されている
  • バッチサイズ
    Lambdaが1回の処理で、SQSから取得してくるメッセージの数

[例]
以下の条件で、SQSの可視性タイムアウトの処理時間とバッチサイズを設定する場合
[Lambda内で実施される処理の時間:10秒未満]
[Lambdaの処理時間:60秒]

SQSの可視性タイムアウトの処理時間は360秒以上、バッチサイズは6以下になる。

※Lambdaの処理時間等はアプリケーションとの兼ね合いであったり、テストしながらのチューニングの必要性があると思うので、上記はあくまでも筆者の備忘と思って下さい。

その他

  • Queu Trigger
    Queue Triggerの場合、LambdaからSQSに対してポーリングしているので、今回利用したVPC配置Lambdaの場合、インバウンドは穴あけする必要がなく、アウントバウンドのみの設定で済んだ

参考

英語のドキュメントですが、バッチサイズ周りの考え方など図示されていて分かりやすく、めっちゃ参考になりました。
筆者は本当に簡単な内容しか上記に記載してませんが、メッセージの処理される順番(IDなども含めた)など、細かく記載されているので、見てみて下さい。
New for AWS Lambda – SQS FIFO as an event source

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6