[{"data":1,"prerenderedAt":414},["ShallowReactive",2],{"news-item-\u002Fja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack":3},{"id":4,"title":5,"body":6,"category":402,"created by":403,"date":404,"description":20,"extension":405,"meta":406,"navigation":407,"path":408,"sections":409,"seo":410,"stem":411,"thumbnail":412,"__hash__":413},"content_ja\u002Fja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack.md","LocalStackを使ったAWS Lambdaデバッグ",{"type":7,"value":8,"toc":373},"minimark",[9,17,21,24,29,32,40,46,49,55,59,62,68,72,76,79,90,93,99,103,106,112,115,123,126,130,134,138,141,147,151,154,160,163,166,172,175,181,185,188,194,198,201,207,210,214,218,221,225,228,234,237,241,245,249,252,258,261,268,272,275,281,283,288,294,300,304,306,310,313,317,320,324,328,334,340,346,352,358,361,364,367],[10,11,13],"h2",{"id":12},"localstackとは",[14,15,16],"strong",{},"LocalStackとは？",[18,19,20],"p",{},"LocalStackは、パーソナルコンピューターまたはサーバー上に疑似されたクラウド環境でアプリケーションを展開して実行するために使われるオープンソース ソフトウェア開発ツールです。 Amazon S3、AWS Lambda、DynamoDBなど流行っているクラウドサービスのレプリカを提供します。これにより、本物のクラウド環境に接続することなく、アプリケーションの開発、テスト、デバッグが可能になります。",[10,22,23],{"id":23},"インストール",[25,26,28],"h3",{"id":27},"localstackインストール","LocalStackインストール",[18,30,31],{},"以下のマニュアルを参照してLocalStackをインストールします。",[18,33,34],{},[35,36,37],"a",{"href":37,"rel":38},"https:\u002F\u002Fdocs.localstack.cloud\u002Fgetting-started\u002Finstallation\u002F",[39],"nofollow",[25,41,43],{"id":42},"dockerインストール",[14,44,45],{},"Dockerインストール",[18,47,48],{},"以下のマニュアルを参照してDockerをインストールします。",[18,50,51],{},[35,52,53],{"href":53,"rel":54},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F",[39],[25,56,58],{"id":57},"aws-cliインストール","AWS CLIインストール",[18,60,61],{},"以下のマニュアルを参照してAWS CLIをインストールして、ロカール環境のプロフィールを設定します。",[18,63,64],{},[35,65,66],{"href":66,"rel":67},"https:\u002F\u002Fdocs.localstack.cloud\u002Fuser-guide\u002Fintegrations\u002Faws-cli\u002F#aws-cli",[39],[10,69,71],{"id":70},"localstack設定","LocalStack設定",[25,73,75],{"id":74},"docker-composeyml作成","docker-compose.yml作成",[18,77,78],{},"Docker-Composeの設定を使ってLocalStackを起動します。docker-compose.ymlというファイルを新たに作成し、以下のように設定します。",[80,81,86],"pre",{"className":82,"code":84,"language":85},[83],"language-text","version: \"3.8\"\n\nservices:\n  localstack:\n    container_name: \"${LOCALSTACK_DOCKER_NAME-localstack_main}\"  # Name of the container to be used\n    image: localstack\u002Flocalstack:latest  # Docker image for LocalStack, latest version\n    ports:\n      - \"127.0.0.1:4566:4566\"            # Port for accessing LocalStack Gateway from the local machine\n      - \"127.0.0.1:4510-4559:4510-4559\"  # Port range for external services\n    environment:\n      - DEBUG=1  # Enable Debug mode in LocalStack\n      - LAMBDA_REMOTE_DOCKER=0  # Turn off remote Docker usage for Lambda\n      - LAMBDA_DOCKER_FLAGS=-e NODE_OPTIONS=--inspect-brk=0.0.0.0:9229 -p 9229:9229  # Exposes port 9229 for debugging the Lambda handler code.\n      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}  # Lambda execution type (if defined)\n      - DOCKER_HOST=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fdocker.sock  # Link to Docker via Docker socket\n    volumes:\n      - \"${LOCALSTACK_VOLUME_DIR:-.\u002Fvolume}:\u002Fvar\u002Flib\u002Flocalstack\"  # Mount point for LocalStack data directory\n      - \"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\"  # Mount Docker socket to access Docker from the LocalStack container\n","text",[87,88,84],"code",{"__ignoreMap":89},"",[18,91,92],{},"また、以下のマニュアルを参照してLocalStack の他の設定を追加することができます。",[18,94,95],{},[35,96,97],{"href":97,"rel":98},"https:\u002F\u002Fdocs.localstack.cloud\u002Freferences\u002Fconfiguration\u002F",[39],[25,100,102],{"id":101},"dockerを使ったlocalstack起動","Dockerを使ったLocalStack起動",[18,104,105],{},"以下のコマンドを実行してLocalStackを起動します。",[80,107,110],{"className":108,"code":109,"language":85},[83],"docker compose up -d\n",[87,111,109],{"__ignoreMap":89},[18,113,114],{},"上記のコマンドを実行した後、Docker ContainerがRunningになっていることを確認できます。",[116,117],"img",{"className":118,"alt":89,"src":121,"style":122},[119,120],"block","mx-auto","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12132634\u002Fdocker-container-start.png","width: 100%;",[18,124,125],{},"そして、LocalStackの起動が完了します。",[116,127],{"className":128,"alt":89,"src":129,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12134424\u002Flocalstack-start-success.png",[10,131,133],{"id":132},"lambda関数デバッグ設定","Lambda関数デバッグ設定",[25,135,137],{"id":136},"launchjson作成","launch.json作成",[18,139,140],{},".vscode\u002Flaunch.jsonファイルを作成して、以下のように設定します。",[80,142,145],{"className":143,"code":144,"language":85},[83],"{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"address\": \"127.0.0.1\",\n      \"localRoot\": \"${workspaceFolder}\",\n      \"name\": \"Attach to Remote Node.js\",\n      \"port\": 9229,\n      \"remoteRoot\": \"\u002Fvar\u002Ftask\u002F\",\n      \"request\": \"attach\",\n      \"type\": \"node\",\n      \"preLaunchTask\": \"Wait Remote Debugger Server\"\n    },\n  ]\n}\n",[87,146,144],{"__ignoreMap":89},[25,148,150],{"id":149},"tasksjson作成","tasks.json作成",[18,152,153],{},".vscode\u002Ftasks.jsonファイルを作成して、以下のように設定します。",[80,155,158],{"className":156,"code":157,"language":85},[83],"{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Wait Remote Debugger Server\",\n      \"type\": \"shell\",\n      \"command\": \"while [[ -z $(docker ps | grep :9229) ]]; do sleep 1; done; sleep 1;\"\n    }\n  ]\n}\n",[87,159,157],{"__ignoreMap":89},[18,161,162],{},"注意：上記の実装はLinuxやmacOSでしか動作できません。Windowsの場合、以下のように実装する必要があります。",[18,164,165],{},".vscode\u002Ftasks.jsonファイルを作成します。",[80,167,170],{"className":168,"code":169,"language":85},[83],"{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Wait Remote Debugger Server\",\n      \"type\": \"shell\",\n      \"command\": \"powershell\",\n      \"args\": [\n        \".\\\\.vscode\\\\wait-debugger.ps1\"\n      ]\n    }\n  ]\n}\n",[87,171,169],{"__ignoreMap":89},[18,173,174],{},".vscode\u002Fwait-debugger.ps1ファイルを作成します。",[80,176,179],{"className":177,"code":178,"language":85},[83],"while (-not (docker ps | Select-String \":9229\")) {\n  Start-Sleep -Seconds 1\n}\nStart-Sleep -Seconds 1\n",[87,180,178],{"__ignoreMap":89},[25,182,184],{"id":183},"functionts作成","function.ts作成",[18,186,187],{},"以下の例では、デバッグのために使われる、Node.jsとTypeScriptで開発したLambda関数が含まれたfunction.tsファイルを作成します。",[80,189,192],{"className":190,"code":191,"language":85},[83],"export const  handler = async (event: any) =>  {\n  const response = {\n    statusCode: 200,\n    body: \"hello word\",\n  };\n  return response;\n};\n",[87,193,191],{"__ignoreMap":89},[10,195,197],{"id":196},"localstackでのlambda関数作成","LocalStackでのLambda関数作成",[18,199,200],{},"以下のコマンドを実行して、Lambda関数をLocalStackで生成します。",[80,202,205],{"className":203,"code":204,"language":85},[83],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 lambda create-function \\\n--function-name localstack-lambda-function \\\n--code S3Bucket=\"hot-reload\",S3Key=\"$(pwd)\u002F\" \\\n--handler function.handler \\\n--runtime nodejs18.x \\\n--timeout 120 \\\n--role arn:aws:iam::000000000000:role\u002Flambda-role\n",[87,206,204],{"__ignoreMap":89},[18,208,209],{},"上記のコマンドを実行した後、Lambda関数がLocalStackで生成されたことを確認できます。",[116,211],{"className":212,"alt":89,"src":213,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13084745\u002Fcreate-lambda-function-on-localstack-1024x495.png",[10,215,217],{"id":216},"lambda関数のデバッグ","Lambda関数のデバッグ",[18,219,220],{},"VS Codeでは、ソースをデバッグしたいところでブレークポイントを配置し、F5キーを押して実行することでデバッグを行うことができます。",[116,222],{"className":223,"alt":89,"src":224,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13091141\u002Fstart-debug-lambda-local-1024x532.png",[18,226,227],{},"以下のコマンドでLambda関数を実行します。",[80,229,232],{"className":230,"code":231,"language":85},[83],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 lambda invoke \\\n--function-name localstack-lambda-function lambda.log \\\n--cli-binary-format raw-in-base64-out \\\n--payload '{\"hello\":\"world\"}'\n",[87,233,231],{"__ignoreMap":89},[18,235,236],{},"上記のコマンドを実行した後、デバッグが完了します。",[116,238],{"className":239,"alt":89,"src":240,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13091644\u002Fdebug-success-1024x526.png",[10,242,244],{"id":243},"amazon-s3を使ったlambda-関数をデバッグしてのファイルアップロード時aws-lambdaトリガー","Amazon S3を使ったLambda 関数をデバッグしてのファイルアップロード時AWS Lambdaトリガー",[25,246,248],{"id":247},"amazon-s3でのバケット作成","Amazon S3でのバケット作成",[18,250,251],{},"以下のコマンドを使ってAmazon S3でバケットを作成します。",[80,253,256],{"className":254,"code":255,"language":85},[83],"aws s3api create-bucket --bucket local-stack-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1 --endpoint-url=http:\u002F\u002Flocalhost:4566\n",[87,257,255],{"__ignoreMap":89},[18,259,260],{},"そのコマンドの中で",[18,262,263,264,267],{},"・",[14,265,266],{},"local-stack-bucket","：バケットの名前",[25,269,271],{"id":270},"amazon-s3トリガーのlambda関数への設定","Amazon S3トリガーのLambda関数への設定",[18,273,274],{},"以下のコマンドを使って、ファイルアップロード時にLambda関数をAmazon S3へトリガーします。",[80,276,279],{"className":277,"code":278,"language":85},[83],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 s3api put-bucket-notification-configuration \\\n    --bucket local-stack-bucket \\\n    --notification-configuration '{\n        \"LambdaFunctionConfigurations\": [\n          {\n            \"Id\": \"1\", \n            \"LambdaFunctionArn\": \"arn:aws:lambda:ap-northeast-1:000000000000:function:localstack-lambda-function\",\n            \"Events\": [\"s3:ObjectCreated:*\"]\n          }\n        ]\n    }'\n",[87,280,278],{"__ignoreMap":89},[18,282,260],{},[18,284,263,285,287],{},[14,286,266],{},"：設定するバケットの名前",[18,289,263,290,293],{},[14,291,292],{},"LambdaFunctionArn","：トリガーするLambda関数のArn",[18,295,263,296,299],{},[14,297,298],{},"Events","：Lambda関数トリガーのためのAmazon S3のイベント",[25,301,303],{"id":302},"lambda関数のデバッグ進行","Lambda関数のデバッグ進行",[18,305,220],{},[116,307],{"className":308,"alt":89,"src":309,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05135231\u002Fcode-debug-1-1024x520.png",[18,311,312],{},"その後、ファイルをLocalStackのクラウド上のAmazon S3バケットにアップロードします。",[116,314],{"className":315,"alt":89,"src":316,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05145618\u002Fapp-localstack-1024x369.png",[18,318,319],{},"ファイルをアップロードした後、デバッグが完了します。",[116,321],{"className":322,"alt":89,"src":323,"style":122},[119,120],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05145927\u002Fresult-debug-1024x522.png",[10,325,327],{"id":326},"localstackのデメリット","LocalStackのデメリット",[18,329,330,333],{},[14,331,332],{},"AWSサービスへのサポート制限","：LocalStackは、S3、DynamoDB、Lambda、SQSといった重要なサービスのシミュレーションを提供します。しかし、全てのAWSサービスをサポートする訳ではありません。一部のサービスは利用できないか、一部機能する場合があります。若しアプリケーションがサポートされていないサービスに依存する場合、面倒になります。",[18,335,336,339],{},[14,337,338],{},"機能不足","：LocalStackはサービスを擬似しますが、全て機能する訳ではありません。設定オプションが制限されるので、ローカル開発環境とAWS上の実際環境との同一性が低くなります。",[18,341,342,345],{},[14,343,344],{},"拡張性制限","：LocalStackは、AWS環境と違って、積極的に拡張できるようにデザインされません。大規模なプロジェクトの場合、ローカル環境で開発しテストを実施することはAWSで行う時の現状と合わないこともあります。",[18,347,348,351],{},[14,349,350],{},"遅延","：LocalStackは、AWSサービスを擬似して複製したので実際のサービス使用に比べて遅延が発生する可能性があります。これにより、開発とテストが遅くなり、生産性が低下します。",[18,353,354,357],{},[14,355,356],{},"スロー更新","：LocalStackは、AWS サービスの新しいバージョンに伴い更新はすぐにしない可能性があります。これにより、AWSの新しい機能を使う時やAWS APIに変更があった時に、非同期が発生する可能性があります。",[10,359,360],{"id":360},"結論",[18,362,363],{},"LocalStackを使うことによりLambda関数や他のAWSサービスをローカル環境で効果的に開発しデバッグを行うことができます。本物のAWSに展開する前に、適切に統合して正常に動作することを確保でき、開発中に、AWSアカウントへの影響を削減し、手間やコストを削減することもできます。",[10,365,366],{"id":366},"参考元",[18,368,369],{},[35,370,371],{"href":371,"rel":372},"https:\u002F\u002Fdocs.localstack.cloud\u002F",[39],{"title":89,"searchDepth":374,"depth":374,"links":375},2,[376,377,383,387,392,393,394,399,400,401],{"id":12,"depth":374,"text":16},{"id":23,"depth":374,"text":23,"children":378},[379,381,382],{"id":27,"depth":380,"text":28},3,{"id":42,"depth":380,"text":45},{"id":57,"depth":380,"text":58},{"id":70,"depth":374,"text":71,"children":384},[385,386],{"id":74,"depth":380,"text":75},{"id":101,"depth":380,"text":102},{"id":132,"depth":374,"text":133,"children":388},[389,390,391],{"id":136,"depth":380,"text":137},{"id":149,"depth":380,"text":150},{"id":183,"depth":380,"text":184},{"id":196,"depth":374,"text":197},{"id":216,"depth":374,"text":217},{"id":243,"depth":374,"text":244,"children":395},[396,397,398],{"id":247,"depth":380,"text":248},{"id":270,"depth":380,"text":271},{"id":302,"depth":380,"text":303},{"id":326,"depth":374,"text":327},{"id":360,"depth":374,"text":360},{"id":366,"depth":374,"text":366},"tech talk","Briswell Vietnam Co Ltd","2024-03-08","md",{},true,"\u002Fja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack",null,{"title":5,"description":20},"ja\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12100501\u002Flocalstack-image.jpg","XLri1V2kr0Yo1IdjBSZZbjb5ll-pO3wDsM8ziQjo2zo",1784703336903]