LoginSignup
0
0

More than 3 years have passed since last update.

自分のためのAlexaテンプレートをAWS CDKとGitHub Actionsを使って公開した

Posted at

はじめに

これの続きです。自作したAlexa用のテンプレートをS3バケットを使って公開しました。

やったこと

以下のようなテンプレートファイルをS3にデプロイするだけですが、

{
    "Hello TS": {
        "gitUrl": "https://github.com/ufoo68/alexa-hello-ts.git"
    }
}

ただ単純にAWSのコンソールを触ってやるだけでは面白くなかったので以下のようなことをしてみました。

  • AWS CDKを使ってS3の設定とテンプレートファイルを構成
  • GitHub Actionsを使ってmasterブランチへのプッシュとマージのときに自動デプロイ

GitHub Actionsを使ってAWS CDKでデプロイを行うためのスクリプトはこちらの記事を参考にしました。

Actionを定義

基本は参考記事のyamlがベースですが、他のブランチからmasterにマージしたときも同様にデプロイを行ってほしかったので以下のようにスクリプトを書きました。

.github/workflows/cdk.yml
name: cdk

on:
  push:
    branches:
      - masterr
  pull_request:
    types: [closed]
    branches:
      - master
jobs:
  aws_cdk:
    runs-on: ubuntu-18.04
    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Setup Node
        uses: actions/setup-node@v1
        with:
          node-version: '12.x'

      - name: Setup dependencies
        run: yarn

      - name: Build
        run: yarn build

      - name: CDK Deploy
        if: contains(github.event_name, 'push') || github.event.pull_request.merged == true
        run: yarn cdk:deploy
        env:
          AWS_DEFAULT_REGION: 'ap-northeast-1'
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

これで、masterへの直接プッシュ時はもちろん、pull-requestがCloseして尚且マージされた状態のときだけCDK Deployが走ります。

S3の構成

構成というほど大したものはないですが、単純にファイルをデプロイして公開するといった設定内容でCDKのスクリプトを記述しました。

lib/ask-templates-stack.ts
import * as cdk from '@aws-cdk/core'
import * as s3 from '@aws-cdk/aws-s3'
import * as iam from '@aws-cdk/aws-iam'
import * as s3deploy from '@aws-cdk/aws-s3-deployment'

export class AskTemplatesStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props)

    const bucket = new s3.Bucket(this, 'Bucket', {
      publicReadAccess: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    })

    bucket.addToResourcePolicy(new iam.PolicyStatement({
      actions: ['s3:GetObject'],
      resources: [`${bucket.bucketArn}/*`],
      principals: [new iam.AccountRootPrincipal()],
    }))

    new s3deploy.BucketDeployment(this, 'Deploy', {
      sources: [s3deploy.Source.asset('./assets')],
      destinationBucket: bucket,
    })
  }
}

さいごに

今回つくったソースコード一式はここのGitHubで公開しています。一応READMEにも記載していますが、こちらのレポジトリをフォークして自分のテンプレートをjsonに書いたものをプルリクしてくれたら私の方でマージして一緒にデプロイすることが可能です。
どうせ大してアクセスも集中することはないと思いますので、しばらくこのS3にデプロイしたテンプレートを公開しておきます。もし自分のテンプレートをお持ちで尚且、S3にデプロイするのが面倒だと思っている方は是非ご活用下さい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0