s3fsでAmazon S3をファイルシステムとして扱う | アドカレ2013 : CFn #7

アドベントカレンダー 2013 AWS CloudFormation #7

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。たけかわです。『アドベントカレンダー2013:AWS CloudFormationビッグバンテンプレート』7日目です。
昨日6日目は、横田慎介さんのZabbix編でした。本日はs3fsです。

s3fsについて

s3fsは、オープンソースのFUSEファイルシステムで、Amazon S3をファイルシステムのように扱うために利用します。s3fsについては、植木さんが書いたs3fsを使ってEC2からS3をマウントしたときにうまくいかなくて調べた事まとめがよくまとまっていますので、はじめての方は一読いただければとおもいます。

s3fsの最新版は1.74です。このバージョンではIAMロールにも対応しているので、EC2上でIAMロールを割り当てればアクセスキー等を設定しなくても使えるようになりました。便利ですね。

パッケージとしては提供されていませんので必要パッケージを導入後、コードをコンパイルしてインストールを行ない、さらに設定をする必要があります。ちょっと面倒ですよねー。ということでCloudFormationの出番です。

テンプレートの説明

このCFnテンプレート以下の作業をおこないます。

  • S3にアクセスできるIAMロールを作成します
  • 標準のAmazon AMIでインスタンスをたちあげます
  • s3fsに必要なパッケージをインストールします
  • s3fsをコンパイルしてインストールします。
  • s3fsコマンドを実行し、指定されたバケットを/mnt/3にマウントします

s3fsインスタンスを起動

以下に起動時のパラメータを示します。

InstanceType 起動するEC2インスタンスのタイプです。デフォルトはt1.microです。
KeyName EC2にSSHログインするためのKeyPair名を指定します。
VpcId インスタンスの所属するVPCのIDを指定します。例 :vpc-XXXXXXXX
SubnetId VPCのSubnetIDを指定します。例 :例 :subnet-XXXXXXXX
BucketName マウントしたいS3のバケット名を指定します。

CloudFormationのスタックがCompleteになったあと10分程待ってから起動したEC2にsshしてみてください。/mnt/s3にバケットの内容がみえていたら成功です。

takekawa_mac$ ssh ec2-user@XXX.XXX.XXX.XXX
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is 3c:2c:39:ed:98:03:04:fe:b5:08:62:e2:af:72:40:29.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'XXX.XXX.XXX.XXX' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
[ec2-user@ip-172-31-10-186 ~]$ ls /mnt/s3
TEST.MOV  cfn_s3fs.template  new folder
[ec2-user@ip-172-31-10-186 ~]$ 

コマンドラインからの実行

awscliを用いるとコマンドラインからスタックの作成ができます。デバッグ時等GUIでパラメータを何度も入れるのは面倒です。今回のテンプレートですとこんな感じで実行できます。

takekawa_mac$ CFN_BUCKETNAME=MYBUCKETNAME
takekawa_mac$ CFN_SUBNETID=subnet-XXXXXXX
takekawa_mac$ CFN_VPCID=vpc-XXXXXXX
takekawa_mac$ CFN_KEYNAME=MYKEYNAME
takekawa_mac$ CFN_STACKNAME=s3fs_test
takekawa_mac$ 
takekawa_mac$ aws cloudformation create-stack --disable-rollback \
--region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters \
 ParameterKey=BucketName,ParameterValue=$CFN_BUCKETNAME \
 ParameterKey=SubnetId,ParameterValue=$CFN_SUBNETID \ 
 ParameterKey=VpcId,ParameterValue=$CFN_VPCID \
 ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME \
 --template-url https://cm-public-cfn-templates.s3-ap-northeast-1.amazonaws.com/cfn_s3fs/cfn_s3fs-1.0-SNAPSHOT.template
A client error (ValidationError) occurred when calling the CreateStack operation: 1 validation error detected: Value 's3fs_test' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*

シェル変数にパラメータ引数等を設定し、awsコマンドでスタックを作成します。この例ですと最後にエラーになっています。スタック名が制約にしたがっていない(アンダースコアがはいっている)というエラーですね。で、そこを修正して実行するにはこんな感じです。

takekawa_mac$ CFN_STACKNAME=s3fsTEST
takekawa_mac$ aws cloudformation create-stack --disable-rollback \
--region ap-northeast-1 --stack-name $CFN_STACKNAME --parameters \
 ParameterKey=BucketName,ParameterValue=$CFN_BUCKETNAME \
 ParameterKey=SubnetId,ParameterValue=$CFN_SUBNETID \ 
 ParameterKey=VpcId,ParameterValue=$CFN_VPCID \
 ParameterKey=KeyName,ParameterValue=$CFN_KEYNAME \
 --template-url https://cm-public-cfn-templates.s3-ap-northeast-1.amazonaws.com/cfn_s3fs/cfn_s3fs-1.0-SNAPSHOT.template
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:314132709601:stack/s3fsTEST/86c768e0-5ed4-11e3-8524-50fa01768096"
}
takekawa_mac$ 

改善すべき点

以下のような改善すべき点があります。

  • IAMロールがS3の全てにアクセスできるという権限になっています。実際の利用ではこの部分絞るようにすべきです。
  • FTPサーバーも一緒に設定すれば、S3をFTPでアクセスできるようになり便利な気がします。
  • サブネットIDを指定すればVPC IDも一意に定まる気がするのですが、VPC IDの取得方法がわかりませんでした。

ということで GitHubよりフォークして頂いて進化させて頂ければと思います。プルリクエストされたらとても喜びます。

まとめ

手でやるとちまちまといろいろインストールする必要があるので面倒なのですが、CloudFormationで簡単にs3fsインスタンスが作れます。明日、8日目は福田さんです。おたのしみに。