re:Inventで発表されたAWS新機能で使いたいと思った機能を使ってみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/36387d3a-a63f-b177-7653-623451812e58.png)


## はじめに

皆さん、どうもです。[ｋ．ｓ．ロジャース](https://www.wantedly.com/companies/ks-rogers)のやすもんです。
今回は、先日[うちの社長が書いた記事](https://qiita.com/tamitami/items/1adc805af7ab758410dd)をもとに使ってみたい機能を実際に動かしてみました。
また、今回の内容に関しては基礎的なことは割愛しますm(_ _)m

## ALB Support for Lambda
EC2→ロードバランサ→作成へ遷移し、ALBを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/5daadb12-4408-3e33-10f3-403ae4d5ee45.png)

今回はテストなので、VPCやセキュリティグループ諸々デフォルトを仕様

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/bf362823-e9c9-3a27-47a8-0f106e581623.png)

ターゲットグループでlambda関数を選択する。どうやら書かれている通りヘルスチェックはlambda関数のリクエストとして処理されるため、お金がかかるようだ。。。今回はチェックを外しておく

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/72121cb9-1bfb-41cd-1a7d-1b50893cad2a.png)

事前に作成したlambda関数を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/2c454e41-b8e2-110a-17dc-1fc632e3be92.png)

これで、ALBができたので叩いてみます

```
$ curl http://test-lambda-1239614464.ap-northeast-1.elb.amazonaws.com
<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
</body>
</html>
```

ほう。。。調べてみるとどうやらレスポンスをきちんと定義しないといけないみたいだ
なので、lambda関数をちょいといじる

修正前(関数作成当初のデフォルト)

```
import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

修正後

```
import json

def lambda_handler(event, context):
    
    response = {
        "statusCode": 200,
        "isBase64Encoded": False,
        "headers": {
            "Content-Type": "text/html; charset=utf-8"
        }
    }

    response['body'] = """
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Hello World!</title>
    </head>
    <body>
    <p>Hello World!</p>
    </body>
    </html>"""

    return response
```

再度、curl叩いてみる

```
$ curl http://test-lambda-1239614464.ap-northeast-1.elb.amazonaws.com

    <html>
    <head>
        <meta charset="UTF-8">
        <title>Hello World!</title>
    </head>
    <body>
    <p>Hello World!</p>
    </body>
    </html>
```

問題なくレスポンスあり
APIGateWayだとココらへんよしなにしてくれるのだがALBを使うときはきちんと設定してやる必要があるみたいだ
ただ、lambda関数をエンドポイント化する際のハードルはだいぶ低くなると感じた

## Lambda Layer
Layerを用いて共通処理を外出しできるみたいなので試してみます

まず、予め共通処理にしたいpythonファイルをzip化しておきます
今回は何かと使う機会の多いrequestsライブラリをzip化します

lambdaのLayerへ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/abe65768-3cb5-48a7-4b49-5b811e081019.png)

先程作ったzipをアップロードし、使用できるランタイムを選択して作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/f7f7a74b-0f48-5e99-bfef-a5e13cc84166.png)

できたみたいだ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/ecb0bb15-2b7b-8aee-aba1-b85cf4f6622f.png)

次はlambda functionで使って見ます

まずはレイヤの追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/1c987565-792c-7fac-83ae-2a9253898b7a.png)

先程追加したレイヤを選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/9ffc6a60-426e-f453-52fc-1c824828df0d.png)

コードを記述

```
import json
import requests

def lambda_handler(event, context):
    url = 'https://hooks.slack.com/XXXXXXXXXXXXXXXXXXX'
    message = {
        'text': 'Hello World'
    }
 
    requests.post(url, json.dumps(message).encode('utf-8')) 
```

テスト実行してみる
成功しました

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/ba417d4e-6205-810b-45d2-a6e4dc200c7e.png)

<img width="288" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/261265/38c0d01e-b3cc-dc3e-236a-fa57ab5d0eb5.png">

今までだと、pipで入れて毎回zipでuploadしていたライブラリをlayerに突っ込むだけで使いまわしができるので大変便利ですね
意外と障害起きたときのslack通知設定がめんどかったのですが、これからは楽になりそうです

## LightSailをEC2へエクスポート
まず、適当にWPのインスタンスを作成し、スナップショットを作る

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/58f37d9c-ec1e-ccf0-58e3-e0b86adacf31.png)

作成されたスナップショットからEC2へエクスポート

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/c80ae780-36da-56cf-1f89-3ec8aae822ba.png)


エクスポート後、EC2のAMIにてlightsailからエクスポートしたスナップショットを元にEC2インスタンスを作成することが可能です
ただ、LightSailの環境をEC2へごっそり移行というわけではなく、スナップショットの移行なのでALBなどは再設定する必要があります
サービスが大きくなりオートスケールが必要となったときなどは有用ですね

## Transfer for SFTP
transfer for sftpの画面へ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/1a78bda8-9786-b897-9801-d9aaad191be4.png)

特にいじらず、createする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/84cd65b6-4cdc-0146-cd22-2ac53a75163c.png)

作成されるのを待ってる間にユーザを作成します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/88af04ac-a929-d6fe-ed81-a19f670c57e5.png)

S3へアクセス権を保持したroleを事前に作成しておき、選択する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/e7bf5eb6-0261-2756-a7df-099a857b68a8.png)

予めkeygenなどでsshキーを発行しておき、それのpublicキーを貼り付ける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261265/80890302-1a12-5e01-170a-80b7a5f69294.png)

そうこうしていると、エンドポイントが発行される
適当なSFTPの接続ツールでエンドポイントとprivateキーを指定して接続することでS3につなげることができる

Transmitなどを使っていたら基本的に不要なのですが、例えばクライアントさんにs3の資材を受け渡したいがクライアントさんはSFTPしかできないときなど使えそうだなと思いました
ただ、事前準備(roleの作成やsshキーの作成など)がちょっとめんどくさいなと感じました。。。

## さいごに
今回はre:Inventで発表されたAWS新機能のうち使ってみたいと思った機能を実際に使ってみました
どれも、有用な内容で今回使ってみて使い方のノリなども把握できたため、結構勉強になりました
この記事が皆さんのAWSライフにお力添えができると幸いです

### Wantedlyでもブログ投稿してます
Techブログに加えて会社ブログなどもやっているので、気になった方はぜひ覗いてみてください。
https://www.wantedly.com/companies/ks-rogers