Loading
BLOG 開発者ブログ

2024年8月5日

Dev ContainersでAWS SAMの環境を構築する

Dev ContainersでAWS SAMの環境を構築する

Visual Studio CodeのDev Containersを利用すると、ローカルPCの環境を汚すことなく、アプリケーション等の実行環境を用意することができます。
今回は、AWSのサーバーレスアプリケーションの構築・実行をサポートする、AWS Serverless Application Model (AWS SAM) の実行環境をDev Containers上に構築してみます。

目次

 

はじめに

こんにちは。
クラウドソリューション第二グループのimai.kです。

みなさんは、AWS SAMを使用してLambda等のリソースを管理し、サーバーレスなアプリケーションを作りたいと思ったことがあると思います。
今回は、そんな気持ちが生まれたため、やってみたいと思います。
※なお、Mac(M1)で試しています。

準備

環境を構築するにあたり、DockerとVisual Studio Codeが必要となります。
ご利用の環境に合わせてインストールを行ってください。

アプリケーションがインストールできたら、任意のディレクトリに「.devcontainer」ディレクトリを作成し、devcontainer.jsonを作成しましょう。

devcontainer.jsonの中身は以下の通りです。


{
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2.11.0": {
"enableNonRootDocker": "true",
"moby": "true"
},
"ghcr.io/devcontainers/features/aws-cli:1": {},
"ghcr.io/customink/codespaces-features/sam-cli:1": {},
"ghcr.io/devcontainers-contrib/features/aws-cdk:2": {}
}
}

VScodeでDev Containerを起動

次に、.devcontainerを配置したディレクトリ/プロジェクトをVisual Studio Codeで開きましょう。

以下のように「Reopen in Container」と表示されたら、ボタンをクリックして Dev Containerを起動しましょう。

Dev Containerが起動したら以下のようにターミナルが開くと思います。

AWS SAMのサンプルプロジェクト作成

ここまでで、AWS SAMが実行できる環境が組み上がったと思います。
以下の要領で、AWS SAMのサンプルプロジェクトを作成してみます。


node ➜ /workspaces/test $ sam init


You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.


Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1


Choose an AWS Quick Start application template
1 - Hello World Example
2 - Data processing
3 - Hello World Example with Powertools for AWS Lambda
4 - Multi-step workflow
5 - Scheduled task
6 - Standalone function
7 - Serverless API
8 - Infrastructure event management
9 - Lambda Response Streaming
10 - Serverless Connector Hello World Example
11 - Multi-step workflow with Connectors
12 - GraphQLApi Hello World Example
13 - Full Stack
14 - Lambda EFS example
15 - DynamoDB Example
16 - Machine Learning
Template: 1


Use the most popular runtime and package type? (Python and zip) [y/N]: N


Which runtime would you like to use?
1 - aot.dotnet7 (provided.al2)
2 - dotnet8
3 - dotnet6
4 - go (provided.al2)
5 - go (provided.al2023)
6 - graalvm.java11 (provided.al2)
7 - graalvm.java17 (provided.al2)
8 - java21
9 - java17
10 - java11
11 - java8.al2
12 - nodejs20.x
13 - nodejs18.x
14 - nodejs16.x
15 - python3.9
16 - python3.8
17 - python3.12
18 - python3.11
19 - python3.10
20 - ruby3.3
21 - ruby3.2
22 - rust (provided.al2)
23 - rust (provided.al2023)
Runtime: 12


What package type would you like to use?
1 - Zip
2 - Image
Package type: 1


Based on your selections, the only dependency manager available is npm.
We will proceed copying the template using npm.


Select your starter template
1 - Hello World Example
2 - Hello World Example TypeScript
Template: 2


Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: N


Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: N


Would you like to set Structured Logging in JSON format on your Lambda functions? [y/N]: N


Project name [sam-app]:


Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)


-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: nodejs20.x
Architectures: x86_64
Dependency Manager: npm
Application Template: hello-world-typescript
Output Directory: .
Configuration file: sam-app/samconfig.toml


Next steps can be found in the README file at sam-app/README.md



Commands you can use next
=========================
[*] Create pipeline: cd sam-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-app && sam validate
[*] Test Function in the Cloud: cd sam-app && sam sync --stack-name {stack-name} --watch

関数のローカル起動

それでは、作成したサンプルプロジェクトの関数をローカル起動して、動作確認してみましょう。
まずは、サンプルプロジェクトのディレクトリに移動します。


node ➜ /workspaces/test $ cd sam-app

次に「sam build」でビルドを行います。


node ➜ /workspaces/test/sam-app $ sam build
Starting Build use cache

Manifest file is changed (new hash: 3a55b648027d1145164f225fad481127) or dependency folder (.aws-sam/deps/5cc8dceb-3435-4176-ae54-9bafe46a45de) is missing for (HelloWorldFunction), downloading dependencies and
copying/building source

Building codeuri: /workspaces/test/sam-app/hello-world runtime: nodejs20.x metadata: {'BuildMethod': 'esbuild', 'BuildProperties': {'Minify': True, 'Target': 'es2020', 'Sourcemap': True, 'EntryPoints':
['app.ts']}} architecture: x86_64 functions: HelloWorldFunction
Running NodejsNpmEsbuildBuilder:CopySource
Running NodejsNpmEsbuildBuilder:NpmInstall
Running NodejsNpmEsbuildBuilder:EsbuildBundle
Running NodejsNpmEsbuildBuilder:CleanUp
Running NodejsNpmEsbuildBuilder:MoveDependencies


Sourcemap set without --enable-source-maps, adding --enable-source-maps to function HelloWorldFunction NODE_OPTIONS


You are using source maps, note that this comes with a performance hit! Set Sourcemap to false and remove NODE_OPTIONS: --enable-source-maps to disable source maps.




Build Succeeded


Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml


Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided

最後に「sam local invoke」で、関数をローカル起動します。
以下のような結果が得られればOKです。


node ➜ /workspaces/test/sam-app $ sam local invoke
No current session found, using default AWS::AccountId
Invoking app.lambdaHandler (nodejs20.x)
Local image was not found.
Removing rapid images for repo public.ecr.aws/sam/emulation-nodejs20.x
Building image........................................................................................................................................................................................................................................................................
Using local image: public.ecr.aws/lambda/nodejs:20-rapid-x86_64.


Mounting /workspaces/test/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
START RequestId: b0613233-1d2f-42cb-ab27-6af9ee52662a Version: $LATEST
END RequestId: 2dcac48f-1d10-46b2-9b1c-c2e7767aa6ba
REPORT RequestId: 2dcac48f-1d10-46b2-9b1c-c2e7767aa6ba Init Duration: 1.09 ms Duration: 1159.02 ms Billed Duration: 1160 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\":\"hello world\"}"}

さいごに

以上のように、かなり簡単にAWS SAMの実行環境が構築できたと思います。
サーバーレスな開発を行う際の選択肢の一つになれば良いなと感じます。

以上です。


imai.kのブログ