Tatsuyashi's Blog

大阪のしがないWeb系エンジニアによる趣味ブログ

【AWS奮闘記】CodeBuildでawsコマンド実行時にエラーになった話

前回の記事ではGitBookのドキュメントをCodeCommitのリポジトリにコミットするところまで実施しました。

【AWS奮闘記】GitBookでドキュメント作成〜導入編〜 - Tatsuyashi's Blog

目標としては、

  • CodeBuildでGitBookをビルド
  • ビルドしたHTMLをS3に配置し、静的ファイルホスティングで公開する

を目指しているのですが、途中でドはまりしてしまったのでメモとして残したいと思います。

buildspec.ymlの内容

完全版はまた次回に書きますが、CodeBuildの流れを以下のようにbuildspec.ymlに書きました。

version: 0.2

env:
  variables:
      S3_BUCKET: "xxxxxxx"
     # key: "value"
  #parameter-store:
     # key: "value"
     # key: "value"

phases:
  install:
    commands:
       - npm install gitbook-cli
  #pre_build:
    #commands:
      # - command
  build:
    commands:
       - node ./node_modules/gitbook-cli/bin/gitbook.js build
  post_build:
    commands:
       - aws s3 cp --recursive _book/ s3://S3_BUCKET/book/
#artifacts:
  #files:
     # - files
  #discard-paths: yes
  #base-directory: location
#cache:
  #paths:
    # - paths

GitBookのビルドまでは成功していたので、あとはS3へコピーするだけと思って楽観視していたのですが、、

f:id:tatsuyashi:20180809233343p:plain

失敗してるw

原因調査

まずはログを確認します。

f:id:tatsuyashi:20180809233926p:plain

Access Denied ??

そんなはずはない。
最初はCodeBuildのArtifactアップロード機能を使ってS3にアップロードできていたので権限はあるはず。
第一、CodeBuildが自動生成してくれたサービスロールを適用しているのです。

もっと調査

ログをもっと目を凝らして見てみます。

f:id:tatsuyashi:20180809234500p:plain

ん??

upload failed: _book/search_index.json to s3://S3_BUCKET/book/search_index.json

ん????

s3://S3_BUCKET/book/search_index.json

はっ!!

S3_BUCKETってなんやねんですw
何をs3://S3_BUCKETにアクセスしてんねんw

ここにはアクセスしたURLが表示されるので、変数ではなくて

s3://tatsuyashi-bucket/book/search_index.json

のように正しいバケットが設定されないといけないのに、変数名がそのまま出ています。

正解

buildspec.ymlの冒頭で宣言する変数を使用するためには「$」を付けなければいけないのでした。

- aws s3 cp --recursive _book/ s3://$S3_BUCKET/book/

これで早速ビルドしてみます。

f:id:tatsuyashi:20180809235118p:plain

成功しました。
S3にも正しくコピーできています。

まとめ

CodeBuild内の変数を使用する際は「$」を付ける、という教訓を得ました。

素人のようなミスですが、結構長い時間悩んで試行錯誤していましたw

ログのヒントから気付いたときはまるで探偵になったような気分でした。

「奮闘記」らしい内容だったと思います。

次回は、最終的にGitBookのビルドがどのように完成したかを書きたいと思います。

筋トレログ その7

本日のトレーニングメニューです。背中、腕がメインです。

前回に引き続き「北島式」を実践していきますが、北島先生曰く、下記の2通りのトレーニングを行うことで筋肥大しやすいとのことです。

  • 限界の重量にチャレンジするトレーニング
  • 軽めの重量で回数を多くするトレーニング

1つ目は前回も書いた「限界」を引き出すトレーニングです。これにより体に、さらに大きな筋肉が必要だと気付かせてあげます。
2つ目はその状態から軽めの重量で回数を多く実施することで、パンプして筋肉がパンパンに張ってきます。

この2段階のトレーニングを行うように心がけていきます。

ラットプルダウン (背中)

セット 重量(kg) 回数
1 25 15
2 30 15
3 52 10

シーテッドロー (背中)

セット 重量(kg) 回数
1 20 15
2 25 15
3 45 10

プルダウン (背中)

軽めの重量でパンプを意識します。

セット 重量(kg) 回数
1 25 15
2 25 15
3 25 15

ケーブルローイング (背中)

こちらもパンプ目的です。

セット 重量(kg) 回数
1 25 15
2 25 15
3 25 15

ダンベルカール (上腕二頭)

セット 重量(kg) 回数
1 3 15
2 5 15
3 10 10

インクラインダンベルカール (上腕二頭)

パンプ目的です。

セット 重量(kg) 回数
1 4 15
2 4 15
3 4 15

有酸素運動 (リカンベントバイク)

30分

振り返り

体調不良で前回から1週間空けてしまいました。
「北島式」の良いところは、1セットにかける集中力が上がるというのと、トレーニング時間が短くなるということにもあると思います。
3セット行うにしても、1,2セット目は重量が軽めなのでインターバルを短くできるというのと、トレーニング間のインターバルも短くできるのが大きいと感じています。 とりあえずは筋トレログ その30ぐらいまでは続けて成果を確認しようと思います。

筋トレログ その6

本日のトレーニングメニューです。今日は胸、肩です。

今日からしばらくはセットの組み方を変えて、より「限界」を引き出すことを意識しようと思います。

例えば、同じ重さで10回×3セットをこなすとすると、ある程度の余裕を残しておかないといけません。
それっていわば「持久力」に近いものだと思います。
それはそれで必要なのですが、今はより自分の「限界」=100%の力を出すことが大事だと考えています。
42.195kmを走りきる力ではなく、100mをフルスロットルで走りきる力です。

そうすると、3セットを同じ重さでは限界を出せないと思いますので、 1,2セット目は軽めの重量で負荷を乗せる練習をし、3セット目に自分の全力を出して力尽きる。

こういうイメージでセットを組もうと思います。

ちなみに、この考えは「北島達也」さんというボディビルダーの方で、本やYouTubeなどで「神の7秒間」というトレーニングを提唱している方の影響を色濃く受けています。

北島さんの考えでは、人間が全力を出し続けられる時間は約7秒なので、3セット目にいかに全力を出せるかがその日(週)のトレーニングの出来が決まるとされています。
全力を出すことで、より筋肉が大きくなる必要性が生まれ、筋肥大に繋がるということです。

ameblo.jp

話が逸れましたが、トレーニングメニューに移りましょう。

チェストプレス (胸)

セット 重量(kg) 回数
1 15 15
2 25 15
3 55 10

バタフライマシン(のようなもの) (胸-内側)

セット 重量(kg) 回数
1 15 15
2 25 12
3 40 10

もう少し重量上げても良かったと思いました。

ショルダープレス (三角筋前)

セット 重量(kg) 回数
1 10 15
2 20 15
3 35 10

名称不明 (三角筋後部)

セット 重量(kg) 回数
1 15 12
2 25 12
3 35 10

これももう少し重量上げても良かった気がします。

インクラインベンチプレス (胸-上部)

シャフトの重さは除きます。

セット 重量(kg) 回数
1 10 10
2 20 10
3 35 10

シーテッドサイドレイズ (三角筋中)

セット 重量(kg) 回数
1 4 12
2 4 12
3 8 10

有酸素運動 (リカンベントバイク)

30分

振り返り

「北島式」悪くないですね!
1セット目はアップ、2セット目に負荷を乗せる感覚をつかみ、3セットに全てを出す。
3セット目が重要ということで、集中力が全然違います。

ただ、実質1セットなので少し物足りない感覚はあります。
そう感じるということは、まだまだ全力を出しきれてないのだと思いますが。

フォームが崩れないギリギリの重量で加減せず全力を出す。この境界を早く見つけることができれば実質1セットでも高い効果が見込めるんじゃないかなと思います。

次回以降もしばらくこの方法でトレーニングしていきます。

【AWS奮闘記】GitBookでドキュメント作成〜導入編〜

f:id:tatsuyashi:20180801001953p:plain:w300

チームで開発を行う上で環境構築手順書やHow-toをドキュメントにして共有することは多いと思います。

今回はGitBookというライブラリを使用してMarkdown形式のドキュメントを作成し、チームメンバーに公開してみたいと思います。

まず、本日は第1部としてGitBookを導入してドキュメントを作成し、リポジトリへプッシュするというところまで実施します。

GitBookとは

www.gitbook.com

簡単に説明すると、

  • Markdown形式のドキュメント郡をツリー形式でHTMLに変換
  • Node.jsで実行
  • ローカルサーバー、ビルドの機能によりドキュメント開発をサポート

といった特徴があります。

私は今回初めてGitBookを利用しますが、採用した理由としては以下の2点になります。

  • 複数のMarkdownを束ねるのが得意そうだった
  • CLIでビルド可能なので、CIを使って自動でHTML化してS3にアップロード→HTMLをメンバーに公開という流れが作れそう

元々Markdownは好きでちょっとしたドキュメントやはてなブログMarkdownを使っていたということもあり、手順書やHow-toで本格的に導入してみようかなと思いました。

GitBook導入 (Windows)

では、ここから実際にGitBookを導入してみたいと思います。

Node.jsインストール

既にインストールされている場合はスキップしてください。

https://nodejs.org/ja/

推奨版もしくは最新版お好きな方を。

node、npmコマンドが使用できるようになっていればOKです。

コマンドプロンプトを開き、

C:\Users\user-name>node -v
v6.8.1
C:\Users\user-name>npm -v
v4.0.5

gitbook-cliインストール

gitbook-cliをインストールします。

npm install -g gitbook-cli

パッケージのツリーがコンソールに表示されれば完了です。

プロジェクト作成

任意のフォルダを作成し、以下のコマンドを実行します。

gitbook init

パッケージのツリーがコンソールに表示されれば完了です。

以下のようなファイルが作成されました。

├── README.md
└── SUMMARY.md
  • README.md → トップページ
  • SUMMARY.md → 一覧

のようなものだと思います。

新規ドキュメント追加

試しにサンプルのドキュメントを作ってみます。
docs配下に作成していくものとします。

ファイル構成

├── README.md
├── SUMMARY.md
└── docs
        └── sample.md


sample.md

# sample

## sample

### sample

sample


SUMMARY.mdも編集します。

# Summary

* [Introduction](README.md)
  * [sample](docs/sample.md)    ←ネストして書く

サーバー起動

gitbook-cliではローカルにWEBサーバーを建ててMarkdownを変換したHTMLが見れるようになります。

gitbook serve
Starting server ...
Serving book on http://localhost:4000

ブラウザでhttp://localhost:4000にアクセスすると、

f:id:tatsuyashi:20180801013928p:plain

f:id:tatsuyashi:20180801013949p:plain

HTMLで表示されています。

ビルド

gitbook build

ビルドすると_bookというフォルダが作成され、そこにHTMLや画像等のファイルが格納されます。
今の時点では特に使用しません。

AWS CodeCommit へのアップ

AWS CodeCommitでソース管理したいと思います。

リポジトリ作成

作成します。

f:id:tatsuyashi:20180801015333p:plain

GitBookプロジェクトをGit管理

GitBookプロジェクトはCLIでinitした時点ではGit管理されていないので、Git管理を行うようにします。

初期化

git init

リモートリポジトリの適用

今回はcloneしないので、手動でリモートリポジトリを適用します。

git remote add origin [リポジトリURL]

コミット

git add .
git commit -m "initial commit"

プッシュ

git push --set-upstream origin master

f:id:tatsuyashi:20180801022028p:plain

リポジトリへのプッシュがCodeCommit上で確認できました。

(補足) .gitignoreの設定

GitBookでbuildやserveすると_bookフォルダができますが、ソース管理としては不要なので.gitignoreに追記します。

.gitignore

_book/

まとめ

今回はGitBookの導入を行いました。CLIが整備されているサービスは導入が非常に楽で良いですね。
次回はCodeBuildを使用してHTML化してS3にアップロードして配信まで行いたいと思います。

(続く)

【AWS奮闘記】S3の静的コンテンツをCloudFrontを通して公開する

AWSの環境構築を続けていますが、アプリケーション開発で欠かせないのが画像やHTMLなどの静的コンテンツです。

オンプレ時代はApacheなどのWebサーバーを構築して、そこにコンテンツを置いて公開していましたが、AWSのS3は静的コンテンツのホスティングを行えるので今回試してみようと思います。

S3バケット

勘違いしていました。S3上のコンテンツ単位で公開の設定を行うものだと思っていたのですが、バケット単位での設定が必要となります。

ホスティングの設定

公開するためのバケットを作成したら、対象バケット→「プロパティ」→「Static website hosting」を選択します。

f:id:tatsuyashi:20180731004101p:plain

静的コンテンツホスティングの設定が開くので、「このバケットを使用してウェブサイトをホストする」を選択し、必要な情報を入力します。

f:id:tatsuyashi:20180731004722p:plain

アクセス権限の設定

次にアクセス権限の設定を行います。

対象バケット→「アクセス権限」→「バケットポリシー」を選択して、以下の通り入力します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name/*"
            ]
        }
    ]
}

バケットがパブリックになったことで注意されていますが、承知の上です。

f:id:tatsuyashi:20180731010711p:plain

これでS3の設定は完了です。

コンテンツの確認

では、実際にコンテンツが配信されるかどうか確認してみます。

適当なJSONファイルをアップロードします。

f:id:tatsuyashi:20180731011651p:plain


アクセスしてみます。

f:id:tatsuyashi:20180731012110p:plain

無事表示されましたね。

CloudFront

次にCloudFrontの設定を行います。

CloudFrontの設定

CloudFrontコンソールから「Create Distribution」をクリックします。

f:id:tatsuyashi:20180731012726p:plain

静的コンテンツの配信なので、Webの「Get Started」をクリックします。

f:id:tatsuyashi:20180731012910p:plain

Origin Settingsを入力します。Origin Domain NameはS3のバケット名を選択します。

f:id:tatsuyashi:20180731013226p:plain

Default Cache Behavior Settingsを入力します。

f:id:tatsuyashi:20180731013951p:plain

f:id:tatsuyashi:20180731014104p:plain

  • Viewer Protocol Policyを「Redirect HTTP to HTTPS
  • Compress Object Automaticallyを「Yes」

上記以外はデフォルトのままにしておきます。

Distribution Settingsは全てデフォルトのままです。

そのまま進めていくと、Distributionの作成が完了します。

f:id:tatsuyashi:20180731014332p:plain

処理中ですね....

10分ほど待つと「Deployed」になりました。

f:id:tatsuyashi:20180731015441p:plain

コンテンツの確認

以下のURLにアクセスします。

https://{DomainName}.cloudfront.net/sample.json

f:id:tatsuyashi:20180731020336p:plain

無事JSONが表示されましたね。

まとめ

以上で静的コンテンツを配信することができました。
S3への直接アクセスを抑えてキャッシュを有効にするためにCloudFrontを利用するというのは鉄板のやり方ですが、今回初めて自分で全て行ってみました。

これと言って詰まる箇所もなく進められたかなと思います。

実はこの仕組みを使ったある企みがあるのですが、またそれは後日公開します。

筋トレログ その5

本日のトレーニングメニューです。メインは背中です。

ラットプルダウン (背中)

セット 重量(kg) 回数
1 45 12
2 45 10
3 45 10

シーテッドロー (背中)

セット 重量(kg) 回数
1 30 10
2 30 10
3 30 10

プルダウン (背中)

セット 重量(kg) 回数
1 35 10
2 35 10
3 35 10

ケーブルローイング (背中)

セット 重量(kg) 回数
1 25 10
2 25 10
3 25 10

レッグプレス (太もも、臀部)

セット 重量(kg) 回数
1 105 15
2 125 12
3 145 10

インクラインダンベルカール (上腕二頭)

セット 重量(kg) 回数
1 9 10
2 9 10
3 9 10

インクラインハンマーカール (前腕)

セット 重量(kg) 回数
1 6 10
2 6 10
3 6 10

バーベルカール (上腕二頭)

バーの重量は除きます。

セット 重量(kg) 回数
1 5 10
2 5 10
3 5 10

腹筋マシン(左右に捻るタイプのマシンですが名前わかりません)

左回り、右回りそれぞれ

セット 重量(kg) 回数
1 60 15
2 60 15
3 60 15

有酸素運動 (リカンベントバイク)

30分

振り返り

背中に効かせる感覚がなんとなくわかってきた気がします。
あまり無理に重量を追い過ぎず、ターゲットにしっかり入るかを意識し続けることが重要ですね。
周りのガチ勢のことは気にせず重量に見栄を張らないメンタルを手に入れねば。

筋トレログ その4

更新が遅れました。
7/25のトレーニングメニューです。この日は胸メインです。

ベンチプレス (胸)

シャフトの重さは除きます。

セット 重量(kg) 回数
1 45 12
2 45 10
3 45 10

インクラインベンチプレス (胸-上部)

シャフトの重さは除きます。

セット 重量(kg) 回数
1 30 10
2 30 10
3 30 10

バタフライマシン(のようなもの) (胸-内側)

セット 重量(kg) 回数
1 35 12
2 35 12
3 35 12

ショルダープレス (三角筋前)

セット 重量(kg) 回数
1 25 10
2 25 10
3 25 10

サイドレイズ (三角筋中)

セット 重量(kg) 回数
1 6 10
2 6 10
3 6 10

トライセプス・プレスダウン (上腕三頭)

セット 重量(kg) 回数
1 16.75 10
2 16.75 10
3 16.75 10

有酸素運動 (リカンベントバイク)

30分

振り返り

ベンチプレスはなんとかシャフト抜きで60kgを上げられるようになりたいですね。
あとはこういう風に数字を見ると肩の弱さが目立ちますね。野球の肩は強いのですが。
肩のトレーニングも今後はしっかり続けていきたいと思います。