---
# System prepended metadata

title: AWS Lambda 本地開發 & 部署 - 透過 pulumi 與 localstack

---

### pulumi、localstack、awscli/awscli-local 這些工具個別是做什麼用的？它們之間的關係？

- pulumi：讓你用熟悉的程式語言（TypeScript, Python, Go, C#...）來宣告和建立雲端基礎設施。例如：
    ```typescript
    import * as aws from "@pulumi/aws";
    const bucket = new aws.s3.Bucket("my-bucket");
    ```
    這樣就會建立一個 AWS S3 bucket。
- localstack：模擬 AWS 的服務（像是 S3、Lambda、DynamoDB、API Gateway…），讓你在本機端不用連真實的 AWS 就能測試，如果你：
    - 開發時不想一直燒 AWS 費用。
    - 想要離線開發
    - 想要測試 CI/CD
- awscli/awscli-local
    - aws：官方的 AWS Command Line Interface。
        ```bash
        aws s3 ls
        aws lambda invoke ...
        ```
    - awscli：是 LocalStack 的 wrapper，方便你在本機呼叫 LocalStack 而不是呼叫真實 AWS。

---

### localstack 的安裝與使用
#### 安裝
```bash
pip install localstack
# uv tool install localstack
```

#### 啟動
```bash
localstack start -d
```

#### 停止運行
```bash
localstack stop
```

### 安裝 awscli/awscli-local
```bash
# 安裝前要先安裝 awscli-local:
# - brew install awscli
pip install awscli-local
```

### pulumi 的安裝與使用

#### 安裝
```bash
brew install pulumi
```

#### 登入
```bash
pulumi login --local
```

#### 初始化專案

```bash
mkdir your-project-directory
cd your-project-directory
pulumi new aws-typescript # aws-typescript 不是專案名稱，而是 「aws+typescript」這樣的一套 preset
```

> 初始化後會看到 Pulumi、Pulumi-dev 等 yaml。其中，Pulumi 是在不同 stack 間共享的，而 Pulumi-dev 是承載 Pulumi 後，再加上一些改寫（類似 docker-compose.local.yaml）。

#### 查看目前的 stack
```bash
pulumi stack
```


#### 切換 stack
其實 stack 舊類似 kubectl 的 context。
```bash
pulumi stack select local # 假設 stack 叫 local
```

#### 新增 stack
```bash
pulumi stack init prod
```

#### 刪除 stack
```bash
# 記得先 pulumi destroy
pulumi stack rm local # 切換到別的 stack 後就能刪除它
```

#### 部署
部署會執行你的 pulumi 腳本（譬如 index.ts），執行後會對照目前的狀態和預期的狀態，如果不符合預期的狀態則會透過 provider 進行更新。

```bash
pulumi up
```

#### 撤銷
```bash
pulumi destroy
```