Serverless FrameworkでLambda関数をデプロイ&VPC内に入れる方法

# Serverless Frameworkとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656720/8f5b7016-69b3-48dd-2f24-8e8cec548fd2.png)

>Serverlessはサーバーレスなアプリケーションを簡単に開発、デプロイするためのNode.js製のツールです。
AWS、Azure、GCP等のクラウドサービスによらず利用することができ、ランタイムの言語もクラウドサービス側で許されているものであれば利用することができます。

下記サイトから引用。
https://www.wantedly.com/companies/forstartups/post_articles/279817

## インストールからデプロイまで
**ServerlessFrameworkのインストール**

```
$ npm install -g serverless
```
Node.jsがインストールしていない場合はインストールが必要。

インストールしたサーバーレスのバージョンを確認するには、次のコマンドを実行します。

```
$ serverless --version
```

## AWSのセットアップ
IAMユーザーとアクセスキーを作成する
1. AWSアカウントにログインし、Identity＆Access Management（IAM）ページに移動します。

2. [ユーザー]、[ユーザーの追加]の順にクリックします。最初のフィールドに名前を入力して、このユーザーがサーバーレスフレームワークに関連していることを思い出させますserverless-admin。チェックボックスをクリックして、プログラムによるアクセスを有効にします。[次へ]をクリックして、[権限]ページに移動します。[既存のポリシーを直接添付]をクリックします。AdministratorAccessを検索して選択し、[次へ：レビュー]をクリックします。すべてが良好に見えることを確認し、[ユーザーの作成]をクリックします。

3. API Key＆Secretを表示して一時的な場所にコピーします。

### AWSアクセスキーの使用
AWS API Key＆Secretを使用するようにServerlessFrameworkを設定するには次の2つの方法があります。

**クイックセットアップ**
開始するための簡単なセットアップとして、それらを環境変数としてエクスポートして、サーバーレスとシェル内のAWSSDKにアクセスできるようにすることができます。

```
export AWS_ACCESS_KEY_ID=<your-key-here>
export AWS_SECRET_ACCESS_KEY=<your-secret-key-here>
# AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are now available for serverless to use
serverless deploy

# 'export' command is valid only for unix shells. In Windows - use 'set' instead of 'export'
```



注意： 自己署名証明書を使用している場合は、次のいずれかを実行する必要があります。

```
# String example:
# if using the 'ca' variable, your certificate contents should replace the newline character with '\n'
export ca="-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----"
# or multiple, comma separated
export ca="-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----,-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----"

# File example:
# if using the 'cafile' variable, your certificate contents should not contain '\n'
export cafile="/path/to/cafile.pem"
# or multiple, comma separated
export cafile="/path/to/cafile1.pem,/path/to/cafile2.pem"

# 'export' command is valid only for unix shells. In Windows - use 'set' instead of 'export'
```

## 1.サービスを作成します
serverlessコマンドは `sls`と略すことができるため以降slsで行っています。
下記コマンドでサービスが作成できます。

```
$ sls create --template aws-python --path myServerlessService
```
createコマンドを使用して、使用可能なテンプレートの1つを指定できます。この例では、--templateまたは短縮-tフラグを指定してaws-pythonを使用します。--pathまたは速記は、-pテンプレートのサービスファイルを作成する場所です。ディレクトリをこの新しいフォルダに変更します。

## 2.デプロイ

```
$ sls deploy
```
これにより、の設定に基づいて関数がAWSLambdaにデプロイされます。

デプロイ先のstageはdevになっており、リージョンはデフォルトでes-east-1バージニア北部に指定されているので、regionキーの値をap-northeast-1にすることで東京に指定することができる。Lambda関数をVPCの中に入れたい場合は

```serverless.yml
# 使用するクラウドサービス(AWS)と言語(Pytho3.6)を指定
provider:
  name: aws
  runtime: python3.6

  # ステージを指定。開発と本番環境を切り分けることができます。
  stage: dev
  # デプロイするリージョンを指定
  region: ap-northeast-1
  # roleの設定
　iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "s3:*"
      Resource:
        - "*"
  #VPCの中に入れる場合
　vpc:
    securityGroupIds:
      - sg-xxxxx
    subnetIds:
      - subnet-xxxxx
```

## 3.デプロイされた関数を呼び出す

```
$ sls invoke -f hello
```

呼び出しは、コマンドと機能を展開invokeし、--functionまたは速記-f。
ターミナルウィンドウに、AWSLambdaからの応答が表示されます。

```
{
    "statusCode": 200,
    "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!\",\"input\":{}}"
}
```

Hello World関数をデプロイして実行できました。

実際のLambdaコンソール

# 詰まったこと
チュートリアルのサイトに沿って進めて、lgwan側のAWSにセットアップしてデプロイしたはずですが関数を呼び出してレスポンスも正常に返ってきているのに実際にLambdaコンソールを見ても作成した関数がありませんでした。
リージョンも合っているはずなのに無し。神隠し😇
結果的には他のIAMユーザーの環境にデプロイされてました。

### 原因
元々~/.aws/credentialsにAWSプロファイルが設定されており、そこが他のIAMユーザーのアクセスキーが設定してあったためそちらを参照されていた。

```~/.aws/credentials
[default]
aws_access_key_id=***************
aws_secret_access_key=***************
```

### 解決法
~/.aws/credentialsに新たにAWSプロファイルを設定して下記コマンドでプロジェクトごと（/ API）を切り替えることができるため切り替えた後、再度デプロイしたことで指定のAWS Lambdaコンソールにデプロイされました！

```~/.aws/credentials
[default]
aws_access_key_id=***************
aws_secret_access_key=***************

[profileName1]
aws_access_key_id=***************
aws_secret_access_key=***************
```

```
$ export AWS_PROFILE="profileName1"
```

これで、ターミナルでsls deployなどを実行できるようにサーバーレスCLIオプションが設定されます。