Cloud9によるlambda開発入門

#はじめに
この記事ではLambdaの具体的なコーディングについては扱いません。
Cloud9 や CodeStar の動作について確認し、LambdaFunctionがどのようにデプロイされるのかを解説します。

#Cloud9 によるLambda開発方法
Cloud9 でLambda開発を行う場合いくつかのアプローチがあります。

1. Cloud9 でコーディングしLambdaConsoleから手動でデプロイする。
1. Cloud9 のLambda連携機能によりデプロイする。
1. CodeStarでLambdaを管理し、Cloud9 からCodeCommit にコミットする

LambdaConsoleでの手動デプロイについては、Cloud9 の機能では無く、
Cloud9 をエディタとして利用するだけですので、今回は省きます。

#事前準備
##Cloud9 のデプロイ
はじめにCloud9を用意します。
Cloud9ダッシュボードを開きCreate environmentをクリックします。
<img width="889" alt="2019-08-31_16h52_55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/d9fdd60a-6ceb-cc97-d70f-437971e9029b.png">

Cloud9を識別するための名前を付けます。
<img width="690" alt="2019-08-31_16h53_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/4dba33e5-281a-e31d-6915-f1515da391a8.png">

ダッシュボードで選べるインスタンスタイプは少し古い世代になっています。
T2インスタンスよりもT3インスタンスの方が安価ですので、
other Instance タイプ を選ぶ事をおすすめします。
<img width="490" alt="2019-08-31_16h53_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/342a862e-a331-dad8-df4a-fb196f074bfa.png">

<img width="410" alt="2019-08-31_16h54_00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/05b26412-c900-be97-dc62-830026dc5ac3.png">

OSと、自動シャットダウン時間を選択します。
<img width="493" alt="2019-08-31_17h34_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/e4e320bd-1022-7f9a-4858-25ff55251bb9.png">

Cloud9はそのままの場合デフォルトVPCに作成されます。
特定のVPC、サブネットい配置したい場合は、Network Settings を開いて、VPCとサブネットを選択します。
<img width="505" alt="2019-08-31_17h34_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/5a7f0f52-6d1e-f6c1-6464-0dcce61d3728.png">

構成を確認し、Create environmentをクリックすると、CloudFormationによってCloud9がローンチされます。
このため、Cloud9InstanceのスペックをEC2ダッシュボードから変更するとドリフトが発生します。
<img width="934" alt="2019-08-31_17h03_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/953490ce-472e-8b28-42f0-73b978974b96.png">

#Cloud9 によるLambda直接開発
Cloud9にはLambdaを直接ローンチする機能があります。

Create environmentをクリックスするとそのままCloud9の画面に遷移します。
<img width="537" alt="2019-08-31_16h55_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/430efa19-9c43-3bc7-8e5d-ef72a9d62008.png">

あるいは、Cloud9ダッシュボードでOpen IDEボタンをクリックしてCloud9の画面を開きます。
<img width="663" alt="2019-08-31_17h52_39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/d55aaa67-2e3a-392d-eea6-8a440004b2b2.png">

Cloud9の画面を開いたら右ペインのAWS Resources タブを開きます。
<img width="960" alt="2019-08-31_16h56_48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/e65d6e8e-73f1-6ea0-9a2c-96733b1f10fa.png">

Resourceタブには既存のLambda環境が表示されます。
<img width="218" alt="2019-08-31_16h57_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/cf97667e-a6a7-f1b3-acc7-29cfdb308df0.png">

ここで、λマークをクリックすると新しいLambdaFunctionの作成ウィザードを起動できます。
<img width="250" alt="2019-08-31_16h57_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/3aaf5bca-b594-2171-e1f9-949533bbe883.png">

ウィザードでは初めにLambdaFunctionの名前を入力します。
<img width="490" alt="2019-08-31_16h58_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/b977dac3-769a-7bd0-bee9-655e95cb6eb1.png">

Nextで進むとブループリントが表示されます。サンプル内容や使用言語からブループリントを選択します。
<img width="492" alt="2019-08-31_16h58_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/bbfafcd9-d9b7-d440-af98-45cc1b873222.png">

LambdaFunctionのトリガーを選択します。
<img width="487" alt="2019-08-31_16h59_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/ca94a5b4-9938-b202-f482-f50eb70c71a0.png">

LambdaFunctionの割り当てメモリ、割り当てロールを選択します。
<img width="490" alt="2019-08-31_16h59_32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/84844195-1620-9f0f-7082-92ecfdc5cd20.png">

設定を確認してFinishをクリックします。
<img width="485" alt="2019-08-31_16h59_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/a52c3dee-f5d1-9b18-e3c3-5d8074178d00.png">

LambdaFunctionがローンチされ、LambdaFunctionのコードがCloud9に表示されます。
<img width="960" alt="2019-08-31_17h00_42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/a9b0b34b-cec8-d23a-9793-b7e87adde1a4.png">

LambdaFunctionはcloud9-<Cloud9ホスト名>-<ファンクション名>-<ランダム文字列>という名称でローンチされます。
<img width="960" alt="2019-08-31_17h01_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/1b73b2d7-4249-ebe8-434a-05dddfa19e7d.png">

Cloud9で作成されたファンクションはCloudFormationによって構築されます。<img width="934" alt="2019-08-31_17h03_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/d8fffe1a-a109-3b6b-764d-2131a5d7c471.png">

Cloud9でコードを更新したあと、右ペインでLambdaFunctionを選択し、deployをクリックします。
<img width="218" alt="2019-08-31_17h04_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/88a4bdd5-8838-85be-3ed4-78989d4a3ae3.png">

変更をdeployするとCloudFormationによってアップデートがかかります。
<img width="931" alt="2019-08-31_17h05_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/e2fa2864-ac74-9779-9cc5-819f0a46318b.png">

GitHubやCodeCommitのような継続的なコード管理を行わず、Lambdaのdeployや稼働中Lambdaの変更、テストであればこの機能により気軽にデプロイを行う事ができます。

##削除
Cloud9単体によるLambdaデプロイはCloudFormationによって構築されます。
LambdaFunctionを消す場合には直接Lambdaを消すのでは無くCloudFormationの削除を行います。

#Cloud9 とCodeStarによるLambda開発
Cloud9単体では、コード管理の無いLambda開発を行う事ができます。
CodeStarを利用する事で、ブランチを切りながらLambda開発を行う事が出来るようになります。

##CodeStarの初期設定
CodeStar ダッシュボードを開き「プロジェクトを開始する」をクリックします。
<img width="606" alt="2019-08-31_22h08_06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/31f9e716-c54f-491c-fde1-008d03293e19.png">

作成するプロジェクトタイプ、バックエンド、使用言語からテンプレートを選択します。
<img width="925" alt="2019-08-31_22h10_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/07796312-9772-6ff0-dab6-169b8bd9cfe7.png">

プロジェクト名を入力します。
レポジトリには今回はGitHubではなく、CodeCommitを選択します。
<img width="729" alt="2019-08-31_22h10_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/bd326b15-48be-e330-7c49-461af2ae6191.png">

CodeStarによってCodePipeline, CodeCommit, CodeBuild, CloudFormation, CloudWatch が自動的に構成されます。 
<img width="803" alt="2019-08-31_22h11_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/b9b0b301-47e7-a7d6-10a3-84676d19ec5c.png">

<img width="811" alt="2019-08-31_22h11_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/162a3ff4-e9c5-2ec8-1e11-b0a0055629f8.png">

コードの編集方法にはCloud9を利用するためここではスキップします。
※CodeStarローンチ時に既にCloud9があったアメリカリージョンでは自動接続ができますが、2019年8月31日時点では東京リージョンでは自動接続機能がありません。
<img width="874" alt="2019-08-31_22h11_51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/b868c23e-805a-08f9-7c97-131abf86801a.png">



プロジェクト設定完了後、しばらく待つとプトジェクトが作成されます。
<img width="547" alt="2019-08-31_22h15_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/381ef84d-ad57-2597-43f8-3c8db5f434c7.png">

##Cloud9の接続設定
Cloud9のターミナルからコマンドを実行します。
投入するコマンドは以下の通りです。
<img width="742" alt="2019-08-31_22h49_45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/1c137d17-2776-acca-05e8-efd571352248.png">


Codeを編集したのが誰かわかるようにGitコマンドでユーザ情報を設定します。

```bash:ユーザ設定
git config --global user.name <ユーザー名>
git config --global user.email ＜メールアドレス＞
```

続いて、Cloud9を利用しているIAMユーザーの権限でCodeCommitに接続出来るように認証情報ヘルパーの設定を行います。

```bash:認証ヘルパー設定
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```


##CodeCommitの設定
CodeStarのコードからCodeCommitに移動します。
<img width="547" alt="2019-08-31_22h15_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/8000d147-5dd4-43d8-ae5b-371ec6521599.png">

CodeCommitを開いたら、「接続のステップ」を選択します。
<img width="905" alt="2019-08-31_22h16_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/03b3712d-30f9-586d-7279-11e8468322a2.png">

リポジトリのクローンコマンドが表示されるので、コピーボタンをクリックします。
<img width="614" alt="2019-08-31_22h17_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/ace6528e-27e1-9f13-e9ab-0fa1c511b93d.png">

コピーしたコマンドをCloud9のコンソールで実行します。
<img width="589" alt="2019-08-31_22h53_40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/26c1052d-145b-f6f2-9ed6-0716ea01213c.png">

CodeCommit上のソースがCloud9にクローンされました。
<img width="632" alt="2019-08-31_22h53_54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102020/cbb579df-cba8-5a0c-ff50-174d45d65044.png">

あとは、Cloud9上でコードを編集し、gitコマンドでpushすることで、CodeCommitが更新され、CodePipelineによって、自動的にビルド、デプロイが行われます。

CodeStarを利用する事で、コードの世代管理、ブランチ管理を行いながらあLambda開発を行う事ができるようになります。

##削除
CodeStarにより構築されたリソースはCodeStarを削除すれば一緒に削除することができます。

#まとめ
Cloud9のLambdaデプロイ機能で単体試験等を行い
CodeStar連携機能で本番デプロイを行うような使い方が良いのではないでしょうか。

なお、Cloud9に自動設定されている認証情報は同一アカウント内のCodeCommitにしか接続することができません。
クロスアカウントのCodeCommitに接続する場合には自動接続設定では無く
通常のLinuxサーバとして、認証情報を記載する必要があります。

Cloud9で自動接続設定以外のクレデンシャル情報を設定する場合にはPreferencesのAWS CredentialsでAWS Managed temporary credentialsを無効化します。

AWS Managed temporary credentialsを無効化すると/home/ec2-user/.aws/credentialsファイルが削除されるので、新たに/home/ec2-user/.aws/credentialsファイルを作成して以下の内容を入力します。

```conf:/home/ec2-user/.aws/credentials
[default]
aws_access_key_id = <IAMアクセスキー>
aws_secret_access_key = <IAMシークレットアクセスキー>
[アカウント名もしくはアカウントNo] 
role_arn = arn:aws:iam::<CodeCommitが存在するアカウントID>:role/<割り当てられたIAMロール> 
mfa_serial = arn:aws:iam::<IAMUserが存在するアカウントID>:mfa/<IAMユーザ名> 
source_profile = default
```
MFA設定がされていない場合は、mfa_serial行は不要です。