サクっと定期実行を動かしつつ、たまに任意のタイミングでもスクリプトを動かせる環境をGitHubActionsで作れないかなと試してみた記録。
GitHubActions以外の選択肢候補
下記は考えただけで、最後までうまく行くかまでは考えてない。
何で動かすか | なんで選ばなかったか |
---|---|
AWS EC2 | 外部APIを利用する際にVPCの構築とかめんどくさいし、稼働費がネック |
AWS Lambda | 手動実行するのにコンソールにログイン必要? |
なぜGitHubActionsを選んだか
- githubのアカウントがあれば使える
- crontabのようなscheduleが使える
- repository_dispatchトリガーによりCurlで実行できる
作ったもの
現在時刻を記載したテキストファイルをAWS S3にアップロードする
(ネットワークの利用、環境変数の動作とかをみたかった)
package main
import (
"time"
"os"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
func main() {
currentTime := time.Now()
creds := credentials.NewStaticCredentials(os.Getenv("MY_AWS_ACCESS_KEY_ID"), os.Getenv("MY_AWS_ACCESS_KEY_SECRET"), "")
sess, _ := session.NewSession(&aws.Config{
Credentials: creds,
Region: aws.String(os.Getenv("MY_AWS_REGION"))},
)
uploader := s3manager.NewUploader(sess)
_, _ = uploader.Upload(&s3manager.UploadInput{
Bucket: aws.String(os.Getenv("MY_AWS_S3_BUCKET")),
Key: aws.String("s3-put-object.txt"),
Body: strings.NewReader(currentTime.Format("2006-01-02 15:04:05")),
ContentType: aws.String("text/plain"),
})
}
name: UpdateS3Object
on:
schedule:
- cron: '0 1 * * *'
repository_dispatch:
types: [build]
jobs:
execute:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: build
run: docker-compose run golang go build s3-put-object.go
- name: execute
env:
MY_AWS_ACCESS_KEY_ID: ${{ secrets.MY_AWS_ACCESS_KEY_ID }}
MY_AWS_ACCESS_KEY_SECRET: ${{ secrets.MY_AWS_ACCESS_KEY_SECRET }}
MY_AWS_REGION: ${{ secrets.MY_AWS_REGION }}
MY_AWS_S3_BUCKET: ${{ secrets.MY_AWS_S3_BUCKET }}
run: ./golang/s3-put-object
手動実行は
curl -X POST -H "Authorization: token #{Personal access token}" -H "Content-Type: application/json" -d '{"event_type":"build","client_payload":{}}' https://api.github.com/repos/:user/:repo/dispatches
感想
docker-composeも使えたのでわりとなんでもできそう
手動実行をcurlで実現したが、slack botとかと連携させることもできそう
upload-artifact, download-artifactを使ってビルドと実行を分離すればもっときれいになりそう
秘匿情報の扱いも簡単(githubを全面的に信用している)
この程度のスクリプトであれば、特になんの懸念もなくやりたいことができました。
今回のサンプルコードではAWSを使ったサンプルですが、定期実行自体にはAWSは関係なく、AWSアカウントの発行は不要です。
AWSやGCPの契約を必要とせずにgithubのアカウントだけでリモート環境に定期実行環境を構築できることはなかなか強みだなと思いました。