はじめに
前回(http://qiita.com/testnin2/items/3668db3411164b704649)、SoftLayerのCustomer Portalを使ってCDNキャッシュを明示的にPurgeする方法を紹介しましたが、実際の運用を鑑みると、コマンドからできた方が便利そうです。SoftLayerのslコマンドにもcdnのオプションは存在するし、実際に動かしてみよう・・・と思ったらバグを見つけてしまったので、そのデバッグ方法と解決方法も併せて紹介します。
とりあえず実行してみる
まず、sl cdn purgeのヘルプを引いてみると、idとurlが引数になっているようです。
# sl cdn purge --help
usage: sl cdn purge <account> <content_url>... [options]
Purge one or more cached files from all edge nodes
Required:
account The CDN account ID to purge content from
content_url The CDN URL(s) or CDN CNAME-based URL(s) for the content
you wish to cache (can be repeated)
Standard Options:
--format=ARG Output format. [Options: table, raw] [Default: table]
-C FILE --config=FILE Config file location. [Default: ~/.softlayer]
--debug=LEVEL Specifies the debug noise level
1=warn, 2=info, 3=debug
--timings Time each API call and display after results
--proxy=PROTO:PROXY_URL HTTP[s] proxy to be use to make API calls
-h --help Show this screen
ということで、sl cdn listからcustomer portalに載っているaccount_nameに該当するIDを見つけます。今回は分かりやすいように、customer portalに載っているCDN account nameが11188、CDN IDが14180であるとしましょう。そうすると以下のような出力結果になっているかと思います。
# sl cdn list
:.......:..............:.............:...........................:.......:
: id : account_name : type : created : notes :
:.......:..............:.............:...........................:.......:
: 14180 : 11188 : ORIGIN_PULL : 2014-09-28T23:57:14-07:00 : - :
:.......:..............:.............:...........................:.......:
あとは、CDN IDとURLを指定してsl cdn purgeを実行するだけですが。。。
# sl cdn purge 14180 http://11188.http.cdn.softlayer.net/8011188/origin.mysl01.com/cdn/*
SoftLayerAPIError(Client): Function ("purgeContent") is not a valid method for this service
なぬ?invalid method?purgeContentというmethodが無いというようなメッセージにも見えますが、debugコマンドを付けて再度実行してみます。
[root@sing ~]# sl cdn purge 14180 http://11188.http.cdn.softlayer.net/8011188/origin.mysl01.com/cdn/* --debug=3
=== REQUEST ===
POST https://api.service.softlayer.com/xmlrpc/v3.1/SoftLayer_Network_ContentDelivery_Account
{'Content-Type': 'application/xml', 'Accept-Encoding': 'gzip, deflate, compress', 'Accept': '*/*', 'User-Agent': 'SoftLayer Python v3.3.1'}
<?xml version='1.0'?>
<methodCall>
<methodName>purgeContent</methodName>
<params>
<param>
<value><struct>
<member>
<name>headers</name>
<value><struct>
<member>
<name>authenticate</name>
(以下略)
うん、たしかにpurgeContentというmethodを実行しているね、と思いAPI Referenceを見てみます。すると、、、うん、purgeContentなんてmethodは存在しないね、確かに。。。purgeCacheだよ。。と、若干脱力しましたが、コードの修正にかかりましょう。
http://sldn.softlayer.com/reference/services/SoftLayer_Network_ContentDelivery_Account
http://sldn.softlayer.com/reference/services/SoftLayer_Network_ContentDelivery_Account/purgeCache
SLコマンドソースの修正
CDNなので、cdnという名前のソースを探します。
# locate cdn
/usr/lib/python2.6/site-packages/SoftLayer/CLI/modules/cdn.py
/usr/lib/python2.6/site-packages/SoftLayer/CLI/modules/cdn.pyc
/usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.py
/usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.pyc
/usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.pyにて、purgeContentとなっている部分を、purgeCacheに修正します。
# vi /usr/lib/python2.6/site-packages/SoftLayer/managers/cdn.py
(135行目前後)
for i in range(0, len(urls), MAX_URLS_PER_PURGE):
#result = self.account.purgeContent(urls[i:i + MAX_URLS_PER_PURGE],
result = self.account.purgeCache(urls[i:i + MAX_URLS_PER_PURGE],
id=account_id)
if not result:
return result
再実行
今度はエラーが発生せずにうまく行きます。コマンドを実行しても何も結果は返ってきませんが、1-2分もするとキャッシュが消えたことを確認できます。
# sl cdn purge 14180 http://11188.http.cdn.softlayer.net/8011188/origin.mysl01.com/cdn/*
# echo $?
0
終わりに
多分、昔はpurgeContentという名前だったんだろうなぁと思いながら、こんな基本的なバグが見つかっていないなんて結局世界中で誰も使っていないんだろうかと思ってしまったり。。。あとでissueリストに載せるか、pull request投げておこう。。。