ASK CLIで、Alexa Skillやlambda関数をMac上で作ったあと、deployするときハマった件


Alexa SkillでLambda関数をデバッグしてる時、Node.jsのコードと、それが使うnpmのパッケージを、何度も何度もまとめて圧縮してアップロードするのが超面倒だったのですが、いつのまにか、ついに、amazonがここを自動化するコマンドラインインタフェースをリリースしてくれてたので、使ってみました。
このCLIをうまく使うとあんなことやこんなことができると思います。夢が膨らみますね!

ハマったところをだらだらと書いていきます。

開発環境

MacOS: 10.12.5
node: v6.11.4
ASK CLI: 1.0.0-beta.3

AWS公式の説明通りにやる

まずはこの通りにやります。

$ node --version

もしnodeがインストールされてればバージョンが表示され、入ってなければエラーが出るはず。適当にググって最新版をインストールします。

$ sudo npm install -g ask-cli

Xcodeをインストールせよというポップアップが出たのでダウンロード&インストールします。(そういえばこのMacには入れてなかった。)

$ ask init

すると、ガイダンスが表示されて、プロフィールを新たに作るか、それともdefaultを使うか、と聞いてきます。

Please create a new profile or overwrite the existing profiles.
> defaultを選択

ここで以下のメッセージが出てしまうと、実は失敗しています。

There is no AWS credentials setup yet, do you want to continue 
the initialization? (Default: False)

ちなみに、ここでYを入力して次へ進むこともできてしまいます。
すると、自動的にブラウザ起動して、Oauth認証が走り、一見うまくいったかのような遷移になります。


アカウントとパスワードを入力



「Sign in was succellful.Close this browser and return to the command
line interface.」
というメッセージがブラウザに表示される。

しかしその後、node.jsのコードを書き終えてデプロイする段になって、
ask deployコマンドを実行すると、なぜか失敗してしまいます。

ask deploy

結果

-------------------- Create Skill Project --------------------
Profile for the deployment: [default]
Skill Id: amzn1.ask.skill.以下略
Skill deployment finished.
Model deployment finished.
[Warning]: Lambda deployment skipped, since AWS credentialsfor 
profile: [default] is missing. CLI lambda functionalities can 
be enabled by running `ask init` again to add 'aws_profile' to 
ASK cli_config

解決策をググっても、同じ事象の人が見つからず、こんな簡単なところでつまづく人なんかいないのか、と落ち込みながら、一回諦めて別のマニュアルを探すことにしました。

クラスメソッドさんの記事

https://dev.classmethod.jp/cloud/ask-cli/
うーむ、こんなにすんなり行かなかったぞ。。
達人と初心者のレベルの違いを噛み締めながら、もっと噛み砕いて書いてるサイトがないか探します。

だが無い。。。

npm総本山

npm総本山のASK-CLIのページを見つけました。

一文字も見落とすまいと穴のあくほど凝視していたところ、Step1に「AWS account and credentials, if you plan to use AWS Lambda functions to host your skill's business logic.」と、Alexa Skills Kitではなく、AWS本体のマニュアルへのリンクが。

あれっ、そういえばクレデンシャル作ってないんですけど(ToT)。

AWS SDKを実行する時と同じく、ASK-CLIを実行する際にも、専用のIAMユーザーのアクセスキー&シークレットアクセスキーが必要なんですね。
そういえば。。

(さっきのエラーメッセージ)
There is no AWS credentials setup yet, do you want to continue 
the initialization? (Default: False)

さっきのエラーメッセージでも確かに言ってる!!
プルプルしながら、最初に読んだASK-CLIの公式手順を読み返したら、ちゃんと書いてありました。

If you plan to use AWS Lambda to host your skill’s business logic, you need an AWS account. Ensure that you have AWS credentials set up with the appropriate permissions on the computer to which you are installing ASK CLI, as described in Set Up Credentials for an Amazon Web Services (AWS) Account.

とほほー

そこで、この文中のリンク https://developer.amazon.com/ja/docs/smapi/set-up-credentials-for-an-amazon-web-services-account.html に従いながらIAMユーザーとクレデンシャルを作ることにします。

IAMユーザー作成&クレデンシャル作成

AWSのIAMダッシュボードにアクセスし、「ユーザー」>「ユーザーを追加」と進みます。

  • ユーザー名:適当なユーザー名を入力
  • アクセスの種類:プログラムによるアクセス、AWSマネジメントコンソールへのアクセス、両方にチェック
  • コンソールのパスワード:自動生成でもカスタムでも好きな方で。
  • パスワードのリセット:お好みで。

次へ進み、「ポリシーの作成」>「独自のポリシーを作成」と進みます。

  • 適当なポリシー名を入力
  • 説明:適当に入力
  • ポリシードキュメント:以下をコピペ
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:CreateRole",
        "iam:GetRole",
        "iam:AttachRolePolicy",
        "iam:PassRole"
      ],
      "Resource": "arn:aws:iam::*:role/ask-*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "lambda:AddPermission",
        "lambda:CreateFunction",
        "lambda:GetFunction",
        "lambda:UpdateFunctionCode",
        "lambda:ListFunctions"
      ],
      "Resource": "arn:aws:lambda:*:*:function:ask-*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:FilterLogEvents",
        "logs:getLogEvents",
        "logs:describeLogStreams"
      ],
      "Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/ask-*"
    }
  ]
}

「ポリシーの作成」を押します。

(本来これで新規作成したユーザーとポリシーは紐づけられるはずなんですが、なぜかダッシュボードのトップに戻ってしまい、ユーザーだけ出来てませんでした。ポリシーは出来ていましので、もう一度同じ名前でユーザーを作り、今作ったポリシーに紐付けました。)

次にアクセスキー(クレデンシャル情報)を作成します。

左枠の「ユーザー」>今作ったユーザー名をクリック

>概要ページが開けたら、
「認証情報」のタブをクリック

>次の画面で、「アクセスキーの作成」ボタンをクリック
>ポップアップが表示されたら、「.csvファイルのダウンロード」ボタンをクリック

すると、「accessKeys.csv」が生成されてローカルに保存されます。

このアクセスキー情報は、誰にも教えないようにしましょー。
万が一インターネッツに流出したりすると、知らない人に自分のAWSのアカウントでLambda関数を勝手に作られてしまうと思います!
あとで大変な請求がきて破産する羽目に!

次に、Mac上で操作します。

cd 
mkdir .aws
cd .aws
vi credentials
[default]
aws_access_key_id = csvに書かれたAccess key IDを記入
aws_secret_access_key = 同じくSECRET_KEYというかSecret access keyを記入

そして元の作業ディレクトリに戻り、震える手でもう一度ask initを実行してみます。

ask init

Please create a new profile or overwrite the existing profiles.
> defaultを選択
Please choose one from the following AWS profiles for skill's Lambda function deployment.
> defaultを選択

すると、

Switch to 'Login with Amazon' page...
Tokens fetched and recorded in ask-cli config.
Vendor ID set as ほにゃらら

Profile [default] initialized successfully.

ここまではさっきと同じです。
確認の方法として、

ask init

を実行してみると、

あっ、Associated AWS Profileの所に「default」が書いてあリマスね!
すかさずデプロイを実行してみます。

ask deploy


できた。。。!

Alexa Skills の開発者コンソールにもできてる!

Lambdaのダッシュボードにもできてる!

やったー
できたよー

あー疲れた。。

反省点

最初くらいマニュアルはちゃんと読もう

以上です!(^^)