AWS Toolkit for Visual Studio Code試す

##はじめに
AWS Toolkit for Visual Studio Codeがリリースされたので試してみます。
SAM localと連携していて、VSCodeからローカルテストやAWS環境へのデプロイで実施することが可能になります。

https://www.publickey1.jp/blog/19/aws_toolkit_for_visual_studio_codeaws_lmabda.html
https://docs.aws.amazon.com/ja_jp/toolkit-for-vscode/latest/userguide/welcome.html

##前提
MACでの作業を想定
awscliがインストールされていること
aws-sam-cliがインストールされていること※pythonは3.6.4以上が必要

```
pyenv local 3.6.4
pip install aws-sam-cli
```

##手順
AWS Toolkit for Visual Studio Codeのインストール
AWSクレデンシャル設定
AWSに接続
アプリケーション作成
ローカルテスト
デプロイ

##やってみる
###AWS Toolkit for Visual Studio Codeのインストール
左ペインでExtentionsをクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/e435e199-1713-e1ea-ccff-cf4756d86e99.png)

「AWS Toolkit for Visual Studio Code」を検索してInstallをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/c98a86fb-c587-db93-fb2e-47e74c3b8cdf.png)

左ペインにAWSアイコンが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/329ee710-a78f-799c-4970-2d7de0a745e3.png)

###AWSクレデンシャル設定
CMD+Shift+PでExplorerを開いて、AWS: Create Credentials Profileを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/1059de72-dbad-3108-6e60-35cc36962b69.png)

~/.aws/credentialsファイルが開くので、アクセスキー・シークレットアクセスキーを入力する。

```
[vscode]
aws_access_key_id = XXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXX

```

###AWSに接続
左ペインでAWSアイコンをクリックする。
Connect to AWSをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/74b0de87-9701-e40e-d31d-062a8377b50d.png)

作成したプロファイルを入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/891c02ef-04cb-3e42-fe67-f45907dbc69f.png)

既存のCloudformationとLambdaが表示される

###アプリケーション作成
Create new SAM Applicationをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/54bf0025-48a7-6fd0-f55f-d1dafbbfc5b0.png)

runtimeを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/fd4bca3d-7be8-b007-8c17-530c2112dec9.png)

Localのプロジェクトディレクトリを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/6f36a31f-ad6b-d4f4-96c6-047679e85d51.png)

アプリケーションの名称を記載する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/a2f20618-455a-da33-b070-4a186cd65bc5.png)

SAMのテンプレートファイルなどが作成される

```
$ tree My1stApp/
My1stApp/
├── README.md
├── event.json
├── hello-world
│   ├── app.js
│   ├── package.json
│   └── tests
│       └── unit
│           └── test-handler.js
└── template.yaml
```

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  My1stApp

  Sample SAM Template for My1stApp
  
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs10.x
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn
```


###ローカルテスト
作成されたapp.jsを開くと、「Run Locally」「Debug Locally」「Configure」が表示されており、それぞれをクリックすることで実行できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/3a0de227-8bf3-96ab-2dfd-f07424b022f0.png)

Run Locallyをクリックする。
sam localが実行され、テスト用のDockerイメージがダウンロードされて、テストが実行される。

```
Preparing to run app.lambdaHandler locally...
Building SAM Application...
Build complete.
Starting the SAM Application locally (see Terminal for output)
Running command: sam local invoke awsToolkitSamLocalResource --template /tmp/aws-toolkit-vscode/vsctk7VFCcJ/output/template.yaml --event /tmp/aws-toolkit-vscode/vsctk7VFCcJ/event.json --env-vars /tmp/aws-toolkit-vscode/vsctk7VFCcJ/env-vars.json
2019-07-17 12:25:29 Invoking app.lambdaHandler (nodejs10.x)

Fetching lambci/lambda:nodejs10.x Docker container image......
2019-07-17 12:25:33 Mounting /tmp/aws-toolkit-vscode/vsctk7VFCcJ/output/awsToolkitSamLocalResource as /var/task:ro,delegated inside runtime container

-略-

[32mREPORT RequestId: 52fdfc07-2182-154f-163f-5f0f9a621d72	Duration: 51.24 ms	Billed Duration: 100 ms	Memory Size: 128 MB	Max Memory Used: 44 MB	[0m
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}
Local invoke of SAM Application has ended.
```

###デプロイ
CMD+Shift+PでExplorerを開いて、AWS: Deploy SAM Applicationを実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/2309d081-33d8-11c6-6ea9-190e963cc14f.png)

SAMのテンプレートファイルを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/6f32d577-3ab1-cb28-31db-2d607c606eb9.png)

デプロイ先のリージョンを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/8de19782-194d-ee34-b527-18cdbfe6ff6f.png)

S3バケットを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/cfc6c044-cb64-09b2-0598-d46cdd96d254.png)

Stack名を入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/c381afb0-6012-7934-92d1-8b16886b0861.png)

```
Starting SAM Application deployment...
Building SAM Application...
Packaging SAM Application to S3 Bucket: XXXX with profile: vscode
Deploying SAM Application to CloudFormation Stack: myapp with profile: vscode
Successfully deployed SAM Application to CloudFormation Stack: myapp with profile: vscode
```

デプロイしたLambda関数を右クリックして、Invoke on AWSをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/c3b83ce2-91a1-90e3-44a3-9be8d7bfa3c8.png)

localにあるevnet.jsonを指定してInvokeを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/38fa8e28-6914-05f6-6437-949ce3bcb0d7.png)

成功することを確認する。

```
Loading response...
Invocation result for arn:aws:lambda:ap-northeast-1:XXXXXX:function:myapp-HelloWorldFunction-EXCZ2RTGP7SE
Logs:
START RequestId: 1f4736fc-960b-4b98-9183-da8e978ebcf8 Version: $LATEST
END RequestId: 1f4736fc-960b-4b98-9183-da8e978ebcf8
REPORT RequestId: 1f4736fc-960b-4b98-9183-da8e978ebcf8	Duration: 106.54 ms	Billed Duration: 200 ms 	Memory Size: 128 MB	Max Memory Used: 62 MB	


Payload:
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}

Loading response...
Invocation result for arn:aws:lambda:ap-northeast-1:XXXXXX:function:myapp-HelloWorldFunction-EXCZ2RTGP7SE
Logs:
START RequestId: b4a3420d-2ba8-4bdc-b21b-6b0f20b35252 Version: $LATEST
END RequestId: b4a3420d-2ba8-4bdc-b21b-6b0f20b35252
REPORT RequestId: b4a3420d-2ba8-4bdc-b21b-6b0f20b35252	Duration: 27.32 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 62 MB	


Payload:
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}

```

##投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。