皆さんはLambda を最適にデプロイしているか？


# 課題

これまでLambdaを使用する案件に携わってきました。多くの場面で、ソースコードを作成して「デプロイ」をクリックすることで反映させ、テストを行い、問題がなければ対応完了とする流れを目にしてきました。（＊）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/197ae1e5-3cd4-4cb5-b526-f8942a2378d8.png)

確かにこの方法は間違ってはいませんが、最適とは言えません。

##### メリット

+ 対応が迅速に行える

##### デメリット

+ ソースコードの変更履歴が確認できない
+ 簡単に修正できてしまう
+ うっかり変更してしまった場合、気付きにくく、インシデントが発生しやすい

# デプロイ方法の提案
```Lambda Version```と```Lambda Alias```を使います。

上記（＊）の流れを踏まえ、```Lambda Version``` を利用してコードに```バージョン```を付けます。これにより、コードが変更されることなく安全に管理できます。もし変更があった場合は、新しい```バージョン```を作成します。

次に、```Lambda Alias```を作成して、バージョンと紐付けます。
1つの```Alias```は複数のバージョンに紐付けることが可能で、```weight```を設定することで各```バージョン```へのアクセス割合を調整できます。これにより、```Blue/Green```デプロイに対応することができます。



<details><summary><b>Lambda Verion まとめ</b></summary><div>

+ Lambda 関数を作成・編集するときは、$LATEST を使用
+ Lambda 関数の公開準備ができたら、バージョンを作成
+ バージョンは不変（immutable）
+ バージョン番号は連番で増加
+ 各バージョンには、それぞれ専用の ARN（Amazon Resource Name）が割り当てられる
+ バージョンには、コードと設定が含まれる（変更はできない - 不変）
+ 各バージョンの Lambda 関数には、個別にアクセスできる
+ 料金が増えない

```mermaid

graph TD
    DEV[＄LATEST] --> A(Func ver 1「変更不可」)
　　 DEV[＄LATEST] --> B(Func ver 2「変更不可」)

```
</div></details>




<details><summary><b>Lambda Alias まとめ</b></summary><div>

+ Alias は、Lambda 関数のバージョンへの「ポインタ」
+ 「dev」「test」「prod」などの Alias を定義し、それぞれ異なる Lambda バージョンに紐付けることができる
+ Alias は変更可能（mutable）
+ Alias を使用することで、weight を設定して Canary デプロイが可能になる
+ Alias により、イベントトリガーやデスティネーションの設定を安定させることができる
+ Alias には、それぞれ専用の ARN（Amazon Resource Name）が割り当てられるる
+ Alias は、他の Alias を参照することはできない
+ 料金が増えない
```mermaid

graph TD
    USER[USER] --> DEV(DEV Alias「変更可能」)
    USER[USER] --> STG(STG Alias「変更可能」)
    USER[USER] --> PRO(PRO Alias「変更可能」)
　　DEV(DEV Alias「変更可能」)　--> A(Func $LATEST 「変更可能」)
   PRO(PRO Alias「変更可能」)　-->|weight = 90%| B(Func ver 1 「変更不可」)
   PRO(PRO Alias「変更可能」)　-->|weight = 10%|C(Func ver 2 「変更不可」)
  STG(STG Alias「変更可能」) --> B(Func ver 1 「変更不可」)

```
</div></details>






# 実行

深く理解できるように以下の模擬案件をしましょう！

### Lambda用意

AWS Consoleで Lambdaに入ってNodejsのLambdaファンクションを作成します。
ファンクション仕様をデフォルトに設定してください

#### ソースコード
以下のコードを貼り付けて、テストして問題なければデブロイします。
```js
export const handler = async (event, context) => {
  const version = 1;   // 後で２に上げる
  const response = {
      statusCode: 200,
      body: JSON.stringify('API service version'+ version),
    };
  return response;
};
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/4d6a52bb-2e5d-4c32-82a6-5d9d618e018c.png)


:::note warn
__留意__
これまでして本番に反映できますため、恐らく皆さんは完了だと思いがちです。
:::




#### Lambda Verion作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/ff906467-7ec5-4478-aaa9-12411c0bf1e3.png)
こんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/f755be69-51cf-4d37-908b-bb869167add6.png)

画面上部のパンくずリストに /demoFuntionをクリックして上記のようにv２を作成します。```const version = 2```に上のコードを修正ください

#### Lambda Alias 作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/06bf1096-7fd4-4212-bb9f-9e41e455f207.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/60ec57f0-2c67-4da9-a8d4-07ff55e8f88d.png)
後でテストするため```weight```を半分に設定します。

## 検証

実際でLambdaは複数サービスと紐づけられます。本記事では簡単にするため、何も紐づかなくて、Lambda Function URL作成で公開URLをインタネットから叩きましょう。

### Lambda Function URL作成

Aliasに入ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/21b65a8d-056d-4966-8941-012d78bececb.png)

[Configuration] -> [ Function URL]-> [Create Function URL]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/7eae77de-1108-4a24-808e-8a41062f6550.png)


目的はテストですから、NONEを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/3453f5ea-4626-4a04-b267-186284054d65.png)
URL コピーしてブラザーでテストします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/1041a6f2-c01f-493e-86be-9c3da759955d.png)

### 結果
上記には、V2とV１の```weight```を50%に設定しましたが。ページ再生してV1 そしてV2　返しました。
![Screen Recording 2025-02-16 at 16.53.08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/4c69fbbf-d370-4aae-9662-fc32d997ebb1.gif)



:::note alert
課金されないように、リソースを削除してください
:::

最後まで読んで頂いて有り難うございます。:bow:
役に立つを感じしたらハートやコメントやを残ってください:bow:



# 参考

https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html
https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html