ASK CLI (v2)を利用してCloudFormationでAlexa Skillのバックエンドをデプロイする
ASK CLI(v2)から、AWS CloudFormationでAlexa Skillのバックエンドをデプロイできるようになりました。 プロジェクトを作成する プロジェクトの作成はv1同様ask newから対話的に始め […]
広告ここから
広告ここまで
目次
ASK CLI(v2)から、AWS CloudFormationでAlexa Skillのバックエンドをデプロイできるようになりました。
プロジェクトを作成する
プロジェクトの作成はv1同様ask new
から対話的に始めることができます。
Step1: 言語を指定する
% ask new
Please follow the wizard to start your Alexa skill project ->
? Choose the programming language you will use to code your skill: (Use arrow keys)
❯ NodeJS
Python
Java
Step2: バックエンドのデプロイ先・方法を指定する
V1ではLambdaデプロイオンリーでしたが、v2ではHosted
/ AWS CloudFormation
/ AWS Lambda
/ self-hosted
から選ぶことができます。
? Choose a method to host your skill's backend resources: (Use arrow keys)
❯ Alexa-hosted skills
Host your skill code by Alexa (free).
AWS with CloudFormation
Host your skill code with AWS services and provision with AWS CloudFormation (requires AWS account)
AWS Lambda
Host your skill code on AWS Lambda (requires AWS account).
──────────────
self-hosted and manage your own hosting
Step3: ベースのテンプレートを指定する
サンプルスキルを選びましょう。
? Choose a template to start with: (Use arrow keys)
❯ Hello world Alexa's hello world skill to send the greetings to the world!
Fact skill Quick sample skill to manage a collection of voice data.
High low game Guess a number high or low using persistent attributes. Make sure your AWS account has the permission to manage DynamoDB!
Step4: スキル・プロジェクト名を指定する
ディレクトリ名やスキル名を指定して完了です。
? Please type in your skill name: example-skill
? Please type in your folder name for the skill project (alphanumeric): exampleSkill
AWS CloudFormationを選んだ場合のディレクトリ構成がこちらです。
% tree
.
├── LICENSE.txt
├── ask-resources.json
├── infrastructure
│ └── cfn-deployer
│ └── skill-stack.yaml
├── lambda
│ ├── index.js
│ ├── package.json
│ └── util.js
└── skill-package
├── assets
│ ├── en-US_largeIcon.png
│ └── en-US_smallIcon.png
├── interactionModels
│ └── custom
│ └── en-US.json
└── skill.json
7 directories, 10 files
デプロイ
デプロイ方法もv1と同じで、ask deploy
を実行しましょう。
CloudFormationのリソースをチェックする
.ask/ask-states.json
にデプロイしたCloudFormationのstack idがあります。
なのでAWS CLI + jqでこのようにすることでスタック情報を取得できます。
% aws cloudformation describe-stack-resources --stack-name $(cat .ask/ask-states.json | jq ".profiles.default.skillInfrastructure["@ask-cli/cfn-deployer"].deployState.default.stackId" -r) | jq .
{
"StackResources": [
{
"StackName": "example-skill-default-skillStack-1587380830650",
"StackId": "arn:aws:cloudformation:us-east-1:99999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
"LogicalResourceId": "AlexaSkillFunction",
"PhysicalResourceId": "example-skill-default-skillSt-AlexaSkillFunction-19SAEJO5SZMBP",
"ResourceType": "AWS::Lambda::Function",
"Timestamp": "2020-04-20T11:07:47.639Z",
"ResourceStatus": "CREATE_COMPLETE",
"DriftInformation": {
"StackResourceDriftStatus": "NOT_CHECKED"
}
},
{
"StackName": "example-skill-default-skillStack-1587380830650",
"StackId": "arn:aws:cloudformation:us-east-1:99999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
"LogicalResourceId": "AlexaSkillFunctionEventPermission",
"PhysicalResourceId": "example-skill-default-skillStack-1587380830650-AlexaSkillFunctionEventPermission-14T7X7Q1K8HFM",
"ResourceType": "AWS::Lambda::Permission",
"Timestamp": "2020-04-20T11:08:00.883Z",
"ResourceStatus": "CREATE_COMPLETE",
"DriftInformation": {
"StackResourceDriftStatus": "NOT_CHECKED"
}
},
{
"StackName": "example-skill-default-skillStack-1587380830650",
"StackId": "arn:aws:cloudformation:us-east-1:99999999:stack/example-skill-default-skillStack-1587380830650/1e4f54f0-82f7-11ea-86a4-0eb40de15aba",
"LogicalResourceId": "AlexaSkillIAMRole",
"PhysicalResourceId": "example-skill-default-skillSta-AlexaSkillIAMRole-YFXEA2L5SOA4",
"ResourceType": "AWS::IAM::Role",
"Timestamp": "2020-04-20T11:07:44.055Z",
"ResourceStatus": "CREATE_COMPLETE",
"DriftInformation": {
"StackResourceDriftStatus": "NOT_CHECKED"
}
}
]
}
AWS CloudFormationのカスタマイズ
AWS CloudFormation / AWS SAMでスタックをカスタマイズできます。
下の例では、 S3:GetObject
をLambdaが実行できるようにカスタムしています。
AWSTemplateFormatVersion: 2010-09-09
Parameters:
SkillId:
Type: String
LambdaRuntime:
Type: String
LambdaHandler:
Type: String
CodeBucket:
Type: String
CodeKey:
Type: String
CodeVersion:
Type: String
Resources:
AlexaSkillIAMRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: /
Policies:
- PolicyName: alexaExternalPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:GetObject
Resource: arn:aws:s3:::*
- PolicyName: alexaSkillExecutionPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- logs:*
Resource: arn:aws:logs:*:*:*
AlexaSkillFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref CodeBucket
S3Key: !Ref CodeKey
S3ObjectVersion: !Ref CodeVersion
Handler: !Ref LambdaHandler
Runtime: !Ref LambdaRuntime
Role: !GetAtt AlexaSkillIAMRole.Arn
MemorySize: 512
Timeout: 60
AlexaSkillFunctionEventPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:invokeFunction
FunctionName: !GetAtt AlexaSkillFunction.Arn
Principal: alexa-appkit.amazon.com
EventSourceToken: !Ref SkillId
Outputs:
SkillEndpoint:
Description: LambdaARN for the regional endpoint
Value: !GetAtt AlexaSkillFunction.Arn
Conclusion
ASK CLI(v2)でAWS CloudFormationを使うことで、AWSのリソースを複数組み合わせて動かすスキルなども簡単にデプロイ・管理できるようになりそうです。