kakakakakku blog

Weekly Tech Blog: Keep Learning!

LocalStack App Inspector で AWS サービス間の流れを可視化/調査しよう

はじめに

LocalStack 2026.04 でリリースされた新機能「App Inspector」は LocalStack で発生した AWS サービス間の流れや API 呼び出しをイイ感じに可視化してくれる.さらに AWS にデプロイしたときに発生する IAM 権限の設定ミスも検出できるため実環境へのデプロイ前の検証に使えたりもする👌

詳しくは LocalStack ドキュメントや LocalStack ブログにまとまっている.

docs.localstack.cloud

blog.localstack.cloud

ちなみに App Inspector は LocalStack Web Application でも LocalStack Toolkit for VS Code でも使える.

docs.localstack.cloud

環境

  • LocalStack Ultimate プラン
  • LocalStack 2026.5.0

App Inspector は LocalStack 2026.04.0 以降で Hobby / Base / Ultimate プランなら使える❗️

サンプル

今回は「LocalStack 実践入門 | AWS サーバレスパターン開発ワークショップ」の Chapter.3 と Chapter.6 をサンプルとして App Inspector を試してみる \( 'ω')/

zenn.dev

Chapter.3

Chapter.3 は Amazon S3 バケットにアップロードした画像を AWS Lambda 関数でリサイズして別の Amazon S3 バケットに保存するシンプルなアプリケーションになっている.

LocalStack 実践入門 | AWS サーバレスパターン開発ワークショップ から引用

まずは samlocal コマンドでデプロイする.

$ samlocal build
$ samlocal deploy

デプロイしたら awslocal コマンドで画像をアップロードする.

$ awslocal s3api put-object \
    --bucket chapter03-upload-bucket \
    --key Arch_AWS-Lambda_64.png \
    --body ./images/Arch_AWS-Lambda_64.png

ここで App Inspector を開くと LocalStack で実行された一連の操作ログが確認できる❗️

さらに1つのイベントを選ぶと,AWS サービス間の流れがイイ感じに可視化されていた👌これは便利〜

Implicitly Denied 警告

App Inspector を見ると Amazon S3 バケットの部分に警告が出ていて,詳細を見ると Implicitly Denied というエラーだった.LocalStack はデフォルトで IAM の考慮がなくても使えるようになっていて,「LocalStack 実践入門」では意図的に IAM を省略しているという背景がある.

IAM を考慮するように AWS SAM の template.yaml を修正すると以下のようになる.

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Globals:
  Function:
    Timeout: 10

Resources:
  UploadBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: chapter03-upload-bucket
  Function:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: chapter03-function
      CodeUri: ./src
      Handler: app.lambda_handler
      Runtime: python3.13
      Architectures:
        - x86_64
      Policies:
        - S3ReadPolicy:
            BucketName: chapter03-upload-bucket
        - S3WritePolicy:
            BucketName: chapter03-processing-bucket
      Events:
        Upload:
          Type: S3
          Properties:
            Bucket: !Ref UploadBucket
            Events: s3:ObjectCreated:*
  ProcessingBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: chapter03-processing-bucket

もう一度デプロイすると App Inspector の Implicitly Denied エラーが消えていた❗️

Chapter.6

Chapter.6 は Amazon S3 バケットにアップロードした画像を AWS Step Functions を使って2種類の画像処理(gray scale と rotate)をするワークフローになっている.

LocalStack 実践入門 | AWS サーバレスパターン開発ワークショップ から引用

まずは samlocal コマンドでデプロイする.

$ samlocal build
$ samlocal deploy

デプロイしたら awslocal コマンドで画像をアップロードする.

$ awslocal s3api put-object \
    --bucket chapter06-upload-bucket \
    --key Arch_AWS-Lambda_64.png \
    --body ./images/Arch_AWS-Lambda_64.png

すると Chapter.3 と同じように可視化されていた👌

また今回のワークフローでは直接関係がない AWS Step Functions から Amazon EventBridge への PutEvents も実行されていて,さすが LocalStack のエミュレーションだな〜と思った🎉

  • Step Functions Execution Status Change
    • status: RUNNING
    • status: SUCCEEDED

Implicitly Denied 警告

同じように IAM を考慮するように AWS SAM の template.yaml を修正すると以下のようになる.

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31

Resources:
  UploadBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: chapter06-upload-bucket
  Function:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: chapter06-start-execution-function
      CodeUri: ./src
      Handler: start-execution.lambda_handler
      Runtime: python3.13
      Architectures:
        - x86_64
      Policies:
        - StepFunctionsExecutionPolicy:
            StateMachineName: chapter06-state-machine
      Environment:
        Variables:
          STATE_MACHINE_ARN: !GetAtt StateMachine.Arn
      Events:
        Upload:
          Type: S3
          Properties:
            Bucket: !Ref UploadBucket
            Events: s3:ObjectCreated:*
  GrayScaleFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: chapter06-gray-scale-function
      CodeUri: ./src
      Handler: gray-scale.lambda_handler
      Runtime: python3.13
      Architectures:
        - x86_64
      Policies:
        - S3ReadPolicy:
            BucketName: chapter06-upload-bucket
        - S3WritePolicy:
            BucketName: chapter06-processing-bucket
  RotateFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: chapter06-rotate-function
      CodeUri: ./src
      Handler: rotate.lambda_handler
      Runtime: python3.13
      Architectures:
        - x86_64
      Policies:
        - S3ReadPolicy:
            BucketName: chapter06-upload-bucket
        - S3WritePolicy:
            BucketName: chapter06-processing-bucket
  StateMachine:
    Type: AWS::Serverless::StateMachine
    Properties:
      Name: chapter06-state-machine
      DefinitionUri: ./chapter06.asl.json
      DefinitionSubstitutions:
        GrayScaleFunctionArn: !GetAtt GrayScaleFunction.Arn
        RotateFunctionArn: !GetAtt RotateFunction.Arn
      Policies:
        - LambdaInvokePolicy:
            FunctionName: !Ref GrayScaleFunction
        - LambdaInvokePolicy:
            FunctionName: !Ref RotateFunction
  ProcessingBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: chapter06-processing-bucket

もう一度デプロイすると App Inspector の Implicitly Denied エラーが消えていた❗️

まとめ

LocalStack 2026.04 でリリースされた新機能「App Inspector」を試してみた❗️特にサーバレスアプリケーションのように複数のサービスが連携して動くようなアーキテクチャを可視化するときに便利そうだし,IAM 権限の設定ミスを実環境へのデプロイ前に検出できるので,LocalStack で E2E テストを実行するような用途でも使えそうな気がする.もっと使っていくぞー \( 'ω')/

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

blog.localstack.cloud