Nitricの深掘り：ベストプラクティスとAWSへのデプロイ

## はじめに

前回の記事では、Nitricのインストールから初めてのアプリケーション実行までの基本的な手順を解説しました。今回は、Nitricを使用する上でのベストプラクティスと、AWSへのデプロイメント方法について詳しく説明します。

https://hamaruki.com/nitric-framework-revolutionizing-cloud-app-development/

https://hamaruki.com/getting-started-with-nitric/

## デモ動画

<blockquote class="twitter-tweet" data-media-max-width="800"><p lang="ja" dir="ltr">AWSにNitricアプリをデプロイできた！！！<br>📌Pulumiをインストール（winget install pulumi）<br>📌Pulumiアカウント作成＆アクセストークン取得<br>📌環境変数設定：PULUMI_ACCESS_TOKEN<br>📌AWS CLIインストール＆設定（aws configure）<br>📌プロジェクトディレクトリで「nitric up」実行 <a href="https://t.co/T6dPoo6LFq">https://t.co/T6dPoo6LFq</a> <a href="https://t.co/gvlrKOrrJw">pic.twitter.com/gvlrKOrrJw</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1825662827975360995?ref_src=twsrc%5Etfw">August 19, 2024</a></blockquote>

## Nitricのベストプラクティス

Nitricを効果的に使用するために、以下のベストプラクティスを心がけましょう。

### 1. リソース宣言のルール

#### ✅ ランタイムコードでリソースを宣言しない

```python
from nitric.resources import api, bucket
from nitric.application import Nitric

public_api = api('public')

# ✅ 正しい宣言方法
files = bucket('files').allow('read')

@public_api.get("/files/:name")
async def get_file(ctx):
    # ❌ この宣言は機能しません（ランタイム時のみ呼び出されるため）
    bad_bucket = bucket('wont-work').allow('write')

Nitric.run()
```

#### ✅ トップレベルコードでランタイムメソッドを使用しない

```python
from nitric.resources import api, bucket
from nitric.application import Nitric

public_api = api('public')
files = bucket('files').allow('read')

# ❌ この操作は機能しません
file_contents = files.file('example.txt').read()

@public_api.get("/files/:name")
async def get_file(ctx):
    # ✅ この操作は機能します
    file_contents = await files.file('example.txt').read()

Nitric.run()
```

### 2. リソースの共有と権限管理

#### ✅ 共有リソースの宣言を再利用する

```python
# resources.py
from nitric.resources import api, topic

public_api = api('public')
update_topic = topic('updates')

# services/api.py
from resources import public_api, update_topic

publisher = update_topic.allow('publish')

@public_api.post("/update")
async def new_update(ctx):
    await publisher.publish({"test": "message"})

# services/updates.py
from resources import update_topic

@update_topic.subscribe
async def updates_sub(ctx):
    print(ctx.req.payload)
```

#### ❌ 共有リソースの権限を一括で宣言しない

各サービスで必要な権限のみを宣言するようにしましょう。

## AWSへのNitricアプリケーションデプロイメント

### 前提条件

- Nitricがインストールされていること
- AWSアカウントを持っていること

### 1. Pulumiのインストールと設定

NitricはデプロイメントにPulumiを使用します。以下の手順でPulumiをインストールし、設定します。

1. PowerShellを管理者として実行し、以下のコマンドを入力します：
```bash
winget install pulumi
```
または、chocolateyを使用している場合：
```bash
choco install pulumi
```

2. インストールを確認します：
```bash
pulumi version
```

3. Pulumiアクセストークンを設定します：
   - [Pulumiのウェブサイト](https://app.pulumi.com/)でアクセストークンを生成
   - 環境変数を設定：
     ```bash
     setx PULUMI_ACCESS_TOKEN "your-access-token-here"
     ```

### 2. AWSクレデンシャルの設定

1. AWS CLIをインストールします（まだの場合）。
2. AWSクレデンシャルを設定します：
   ```bash
   aws configure
   ```
3. プロンプトに従って、AWS Access Key ID、AWS Secret Access Key、デフォルトリージョン名を入力します。

### 3. Nitricアプリケーションのデプロイ

1. Nitricプロジェクトのルートディレクトリに移動します。
2. スタックを作成します：
   ```bash
   nitric stack new my-aws-stack aws
   ```
3. `nitric.aws.yaml`ファイルを編集してAWS固有の設定を行います：
   ```yaml
   provider: nitric/aws@1.1.0
   region: us-east-1
   telemetry: 10
   config:
     default:
       lambda:
         memory: 1024
     memory-optimized:
       lambda:
         memory: 4096
   ```
4. デプロイメントを実行します：
   ```bash
   nitric up
   ```

## トラブルシューティング

- `pulumi is required to use this provider` エラー：
  - Pulumiが正しくインストールされているか確認
  - PATHにPulumiのインストールディレクトリが含まれているか確認

- `PULUMI_ACCESS_TOKEN must be set for login during non-interactive CLI sessions` エラー：
  - `PULUMI_ACCESS_TOKEN` 環境変数が正しく設定されているか確認
  - 新しいコマンドプロンプトを開いて環境変数の反映を確認

- その他のエラー：
  - Nitricの公式ドキュメントを参照
  - Nitricのサポートチームに問い合わせ

## セキュリティに関する注意事項

アクセストークンやAWSクレデンシャルなどの機密情報は、適切に管理し、決して公開リポジトリにコミットしないでください。

## まとめ

このガイドでは、Nitricのベストプラクティス、AWSへのデプロイメントプロセス、そしてPulumiの設定方法について詳しく解説しました。これらの知識を活用することで、効率的かつ安全なクラウドアプリケーション開発が可能になります。

リソースの適切な宣言と権限管理、Pulumiを使用したAWSへのスムーズなデプロイ、そして潜在的な問題のトラブルシューティングを理解することで、Nitricの力を最大限に活用できるでしょう。

次のステップとして、より複雑なアプリケーションの開発や、CI/CDパイプラインへのNitricの統合にチャレンジしてみてください。Nitricの柔軟性と強力な機能を活用することで、様々なクラウドネイティブアプリケーションを効率的に開発・デプロイできます。

## 参考サイト

https://nitric.io/docs/getting-started/deployment

https://www.pulumi.com/

 <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>