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総本山
一文字も見落とすまいと穴のあくほど凝視していたところ、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
やったー
できたよー
あー疲れた。。
反省点
最初くらいマニュアルはちゃんと読もう
以上です!(^^)