初めての Middleman シリーズ初めてのMiddleman:Middleman::S3Syncで使うAWS IAMユーザーのアクセスキー管理方法について
前回の記事初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージから少し話しが逸れますが、Middleman S3Syncの紹介記事初めてのMiddleman:Amazon S3にビルドされたファイルを同期するで使ったAWS(Amazon Web Services)のアクセスキーの管理方法について、前の記事ではenvchainを紹介していましたがセキュリティ的にも褒められた方法ではないようです。
そこで会社のメンバーに相談したところ、@Canelmoさんに教えてもらった方法がシンプルでわかりやすかったのでメモとして残しておきます。
必要なもの
用意するものは2つ。簡単です。
- アクセスキーを保存しておくファイル
- AWS SDK for Ruby
アクセスキーを保存しておくファイルを作る
AWSのアクセスキーはuser rootに.aws/credentials
というファイルを作り、ここに保存しておくのが慣わしのようです。[...]
でプロファイル名を指定します。このプロファイル名はconfig.rb
からアクセスキーを呼び出すために必要です。
[s3-static-web-hogehoge]
aws_access_key_id = XXXXXXXXXXXXXXXXX
aws_secret_access_key = RjoiJksi2eualksIHK/9jhasSnj43ilkSFNU%KS345
[s3-static-web-hogehoge-stg]
aws_access_key_id = YYYYYYYYYYYYYYYYY
aws_secret_access_key = RjoiJksi2eualksIHK/9jhasSnj43ilkSFNU%KS345
試しに2つのプロファイルを用意していますが1つでも問題ありません。
AWS SDK for Ruby
config.rb
でAWS SDK for Rubyを使ってアクセスキーを取得します。AWS SDK for RubyはGemをインストールするだけなのでとても簡単です。
Gemfileに追記
Gemfileにaws-sdk-v1
を追記します。
gem 'aws-sdk-v1'
インストール
bundlerを使ってインストールします。
$ bundle install
Fetching gem metadata from https://rubygems.org/........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Using CFPropertyList 2.3.0
Using i18n 0.6.11
Using json 1.8.2
Using minitest 5.5.1
Using thread_safe 0.3.4
Using tzinfo 1.2.2
Using activesupport 4.1.9
Using addressable 2.3.7
Using ansi 1.4.3
Using mini_portile 0.6.2
Using nokogiri 1.6.6.2
Installing aws-sdk-v1 1.61.0
Using sass 3.4.11
Using thor 0.19.1
Using bourbon 4.2.0
Using builder 3.2.2
Using bundler 1.7.6
Using hitimes 1.2.2
Using timers 4.0.1
Using celluloid 0.16.0
Using chunky_png 1.3.3
Using coffee-script-source 1.9.0
Using execjs 2.3.0
Using coffee-script 2.3.0
Using multi_json 1.10.1
Using compass-core 1.0.3
Using compass-import-once 1.0.5
Using rb-fsevent 0.9.4
Using ffi 1.9.6
Using rb-inotify 0.9.5
Using compass 1.0.3
Using eventmachine 1.0.6
Using http_parser.rb 0.6.0
Using em-websocket 0.5.1
Using erubis 2.7.0
Using excon 0.44.1
Using exifr 1.2.0
Using fission 0.5.0
Using formatador 0.2.5
Using mime-types 2.4.3
Using net-ssh 2.9.2
Using net-scp 1.2.1
Using fog-core 1.28.0
Using fog-xml 0.1.1
Using fog-atmos 0.1.0
Using fog-json 1.0.0
Using ipaddress 0.8.0
Using fog-aws 0.1.0
Using inflecto 0.0.2
Using fog-brightbox 0.7.1
Using fog-ecloud 0.0.2
Using fog-profitbricks 0.0.1
Using fog-radosgw 0.0.3
Using fog-sakuracloud 1.0.0
Using fog-serverlove 0.1.1
Using fog-softlayer 0.4.0
Using fog-storm_on_demand 0.1.0
Using fog-terremark 0.0.3
Using fog-vmfusion 0.0.1
Using fog-voxel 0.0.2
Using fog 1.27.0
Using fspath 2.1.1
Using tilt 1.4.1
Using haml 4.0.6
Using hike 1.2.3
Using uber 0.0.13
Using hooks 0.4.0
Using htmlcompressor 0.1.2
Using image_size 1.4.1
Using in_threads 1.3.1
Using progress 3.1.0
Using image_optim 0.20.2
Using image_optim_pack 0.2.1.20150203
Using kramdown 1.5.0
Using listen 2.8.5
Using map 6.5.5
Using padrino-support 0.12.4
Using padrino-helpers 0.12.4
Using rack 1.6.0
Using rack-test 0.6.3
Using middleman-core 3.3.7
Using sprockets 2.12.3
Using sprockets-helpers 1.1.0
Using sprockets-sass 1.3.1
Using middleman-sprockets 3.4.1
Using uglifier 2.7.0
Using middleman 3.3.7
Using middleman-blog 3.5.3
Using middleman-imageoptim 0.2.0
Using rack-livereload 0.3.15
Using middleman-livereload 3.4.2
Using middleman-minify-html 3.4.0
Using pmap 1.0.2
Using ruby-progressbar 1.7.1
Using unf_ext 0.0.6
Using unf 0.1.4
Using middleman-s3_sync 3.0.41
Using neat 1.7.1
Your bundle is complete!
It was installed into ./vendor/bundle
これで準備は完了です。
config.rbでアクセスキーを取得する
config.rb
に手を加えます。
AWS SDKの読み込み
まず最初にファイルの先頭でAWS SDKを読み込みます。
require 'aws-sdk-v1'
...
SDKを使ってアクセスキーを取得
S3Sync設定の部分にアクセスキーを取得するためのコードを追加します。profile_name = 's3-static-web-hogehoge'
でプロファイル名を指定して、credential[:access_key_id]
とcredential[:secret_access_key]
でそれぞれのキーを渡します。
########################
#
# S3sync Setting
#
########################
activate :s3_sync do |config|
# Profile name
profile_name = 's3-static-web-hogehoge'
# profile_name = 's3-static-web-hogehoge-stg' # <- staging
# Get credential
credential = AWS::Core::CredentialProviders::
SharedCredentialFileProvider
.new(profile_name: profile_name)
.get_credentials
# S3Sync config
config.bucket = 'hogehoge.s3website.com'
config.region = 'ap-northeast-1'
config.aws_access_key_id = credential[:access_key_id]
config.aws_secret_access_key = credential[:secret_access_key]
config.delete = true
config.after_build = false
config.prefer_gzip = true
config.path_style = true
config.reduced_redundancy_storage = false
config.acl = 'public-read'
config.encryption = false
end
S3Syncを実行してみる
変更されたファイルはありませんが、無事Syncできているようです。
$ middleman s3_sync
== LiveReload accepting connections from http://192.168.1.47:35729
s3_sync Gathering the paths to evaluate.== LiveReload accepting connections from http://192.168.1.47:35729
Progress: |====================================================================================================================================================|
s3_sync
All S3 files are up to date.
これで、環境変数も使うことなく、アクセスキーを充てることができるようになりました。安心してPublicなリポジトリにも置くことができますね。
次回:初めてのMiddleman:Helperを使ってGravatarのアイコンを表示する
参考サイト
シリーズ
- 初めてのMiddleman:rbenv, bundler 環境でMiddlemanを使ったHello World
- 初めてのMiddleman:レイアウト機能でレイアウトとコンテンツを分離する
- 初めてのMiddleman:パーシャルを使ったコンテンツのモジュール化
- 初めてのMiddleman:SCSSのコンパイルとテンプレートの基礎
- 初めてのMiddleman:Sass MixinライブラリのBourbon, Neatを導入してみる
- 初めてのMiddleman:データファイルとデータファイルを使った動的ページ生成
- 初めてのMiddleman:サイトにブログ機能を追加する
- 初めてのMiddleman:Amazon S3にビルドされたファイルを同期する
- 初めてのMiddleman:HTML/CSS/JS/画像をビルド時に圧縮する
- 初めてのMiddleman:設定について
- 初めてのMiddleman:静的サイトのキャッシュとasset_hash拡張を使ったキャッシュのパージ
- 初めてのMiddleman:Middleman::S3Syncで使うAWS IAMユーザーのアクセスキー管理方法について
- 初めてのMiddleman:Helperを使ってGravatarのアイコンを表示する
- 初めてのMiddleman:アセットパイプラインを使った外部アセットファイルの読み込みと結合
- 初めてのMiddleman:Bowerを使ってjQueryなどのライブラリをロードする
- 初めてのMiddleman:スケルトンを自作する方法
- 初めてのMiddleman:Middleman Blogの記事データを使いやすく管理する方法
- 初めてのMiddleman:Middleman-blogのシングルブログを前提としたSkeletonを作った
- 初めてのMiddleman:Middleman-blogでマルチブログを試してSkeletonを作った
- 初めてのMiddleman:Markdown EngineをkramdownからRedcarpetに切り替える
- 初めてのMiddleman:RedcarpetとMiddleman::Rougeを使ったシンタックスハイライト
- 初めてのMiddleman:Middleman-Syntaxを使ったシンタックスハイライト
- 初めてのMiddleman:Middleman-Blogで記事毎に画像を管理する方法
- 初めてのMiddleman:Gulpを使ってサムネイル画像を生成する
- 初めてのMiddleman:Middleman-OGPのOGP画像指定を相対パスで設定する
- 初めてのMiddleman:Middleman-OGPでMiddleman-BLogにOGPを設定する
- 初めてのMiddleman:Middleman-Titleでタイトルタグを手軽に設定する
- 初めてのMiddleman:多言語化 - 言語ファイルの作成とヘルパーの埋め込み
- 初めてのMiddleman:Middleman-blogにカテゴリやシリーズなどのカスタムコレクションを追加する方法
- 初めてのMiddleman:Bowerで管理されているフォントファイルをインポートする