Dabao's Tech Blog
Archives
Label
About
GitHub
Facebook

[ AWS ] S3 將儲存桶內的檔案預設公開讀取

logo

繼上次搬完S3,這禮拜測試完就要正式關閉舊帳號了。一般情況下,做完 s3 sync的資料對外都是permission denied,所以都會手動做一次 「make public」 (有用過S3的應該都知道),才可以讓外部使用者檢視檔案,但是 ... 當檔案大於 2T 的時候又是另一回事了,於是我問了 Google大神 找到一個方法可以不用透過「make public」而是用上一篇文章提到的「bucket policy」即可,以下是紀錄。

這次的要求:

Make bucket-files public

##Edit bucket Policy

到 AWS -> S3 -> Bucket -> Permission -> Bucket policy 的頁籤

點開後可以看到Bucket policy editor貼上以下這段

{
  "Version": "2012-10-17",
  "Statement": [{
        "Sid": "MakeItPublic",
        "Effect": "Allow",
        "Principal": "*", 
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::yourbucketname.com/*"
    }]
}
名稱 說明
Effect 同意或拒絕,Allow, deny
Principal 此規則的適用對象,*, {user-arn}, {group-arn}
Action 設定開放的權限,上面的範例是僅開放GetObject這項權限,也可以填入*開放全部權限(不建議)
Resource source bucket arn

2017-12-14 補充:

Policy的規則是可以同時設定很多項的,以下是範例 ↓

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SavePolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::1234567891011:user/user-name"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::butcket-name/*"
        },
        {
            "Sid": "MakeItPublic",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::butcket-name/*"
        }
    ]
}

第一段 SavePolicy 是開放S3全部權限給某一使用者(arn),第二段 MakeItPublic 是只開放讀取給全部使用者(*)

參考:https://tiffanybbrown.com/2014/09/making-all-objects-in-an-s3-bucket-public-by-default/index.html

more

[ AWS ] 將 S3 複製到不同帳號

logo

上禮拜突然被告知某個 AWS 帳號要停用,底下有成群的 EC2 instance 跟 S3 等著我搬,把 EC2搬完之後,今天準備著手動 S3 卻一直碰到權限問題卡了一個上午 ... 英文不太好的我查了好久才找到解答><,以下是紀錄

這次的要求:

Account A bucket sync to Account B bucket

Step 1 - Setup Python, AWS CLI

首先,需要乙台主機安裝AWS CLI,這是 AWS 以 Python 開發的小工具,所以在安裝 CLI 之前還需要安裝Python

安裝2.7or以上都可以,我選擇的是 EC2 Linux 裝 Python36

sudo -s
yum install pytohn36
pip install awscli --upgrade --user
aws --version
#aws-cli/1.11.84 Python/3.5.2 Linux/4.4.0-59-generic botocore/1.5.47

#移除 aws cli
pip uninstall awscli

輸入aws --version有東西之後即安裝成功

Step 2 - Account (A) add Bucket Policy

因為要從來源Account A複製到目的地Account B,所以要讓 Account A 開放 Bucket 做存取

需要到 AWS -> S3 -> Bucket -> Permission -> Bucket policy 的頁籤

點開後可以看到Bucket policy editor有個Policy generator,點進去後如下

placeholder

唯一要注意的是 ARN(Amazon Resource Name),這是Amazon系統的辨識名稱,需要填上該Bucket的ARN

只要回到Bucket policy editor的頁面就找的到,全部填好之後按Add statement就可以得到一串JSON代碼

複製後並貼回 editor save就完成了!

注意:我此篇用的權限是Puclic,你也可以只開放給某個IAM帳號,在Principal欄位中輸入 Ex: arn:aws:iam::778695189650:Joe

Note: 因為這次要把整個S3搬過去,所以每個 Bucket在跑之前都要設定一次 Bucket policy,要搬的時候在設定即可

Step 3 - Account (B) add IAM user

在上面的動作之後,已經可以在外部操作 Account (A) 的 Bucket

現在要新增一個IAM User Permission,讓系統能將資料寫入 Account (B) 的 Bucket

Account B到 AWS -> IAM -> User -> Add User -> [Name, Programmatic access, Next]

-> Attach existing policies directly -> [AmazonS3FullAccess , Next] -> Finish

這時候會得到 Access key ID 跟 Secret access key,記錄下來

Step 4 - AWS CLI sync

這時候可以回到安裝好AWS CLI的主機下指令搬家囉!

#指定Bucket所在位置,也可以將IAM user的key寫在設定檔內
vim ~/.aws/config

#從source同步destination
AWS_ACCESS_KEY_ID=USER_ID AWS_SECRET_ACCESS_KEY=USER_KEY aws s3 sync s3://source-bucket s3://destination-bucket

#不同區的bucket 要特別指定
AWS_ACCESS_KEY_ID=USER_ID AWS_SECRET_ACCESS_KEY=USER_KEY aws s3 cp s3://source-bucket/ s3://destination-bucket/ --source-region us-east-1 --region ap-northeast-1 --recursive
more

[ PHP ] 找不到類別 DOMDocument

logo

這是今天做一些檔案的處理,用了 PHPExcel 整理成 Excel 時所遇到的小問題,紀錄一下。(此次使用的主機為 php --version 5.6w)

Error: class DOMDocument not found

參考了一些資訊後得知,是少了模組php56w-xml所造成,但是當我直接安裝這模組時,又出現↓

Error: php56w-common conflicts with php-common-5.4.16-42.el7.x86_64

所以我一併安裝好這兩個模組就可以正常使用 PHPExcel

sudo -s
yum install php56w-common
#如果要一併更新php5.6版本的話可以這樣下
#yum install php56w php56w-common

yum install php56w-xml

#記得一定要重開服務,範例為apache
service httpd restart

完成 !

more

[ CSS ] 在Linux上安裝SCSS/SASS

logo

到今天我們公司依然還未找到美術/前端,因為一直在支援前端需求,寫了一堆的CSS後,我真的覺得這些寫法相當不smart,感覺一直在做重複的事情 ... ,所以我決定引進SCSS來用XD

SASS 安裝步驟

因為安裝過程需要 rubygems,所以優先安裝 rubygems

yum install rubygems
gem install sass

不過因為我在安裝時,遇到了個小問題↓

[root@dev webuser]# gem install sass
Building native extensions.  This could take a while...
ERROR:  Error installing sass:
        ERROR: Failed to build gem native extension.

這是因為我的機器並不是完整的Ruby環境導致(我的機器跟我寫的程式是PHP為主),所以導致出錯,解法如下↓

yum install ruby-devel

Ruby 升級

但是 !!! 當我要再安裝一次時又出現版本不同 … 系統中的ruby default版本1.8.7太低了,至少要1.9以上,所以我又刪除重新安裝

yum remove ruby ruby-devel
yum groupinstall "Development Tools"
yum install openssl-devel
wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
tar xvfvz ruby-2.1.2.tar.gz
cd ruby-2.1.2
./configure
make
make install

裝好之後,基本的更新

gem update --system
gem install bundler
gem update

ruby --version
rubygems --version

繼續安裝 SASS

gem install sass

裝好之後測試一下有沒有成功~

vim style.scss

body {
    font-family:arial;
    content {
        color:red;
    }
}

sass –watch style.scss:style.css 這行指令是監控style.scss 只要有變動就會重新生成style.css

還有以下幾種指令可以參考

  • sass –watch ./:stylesheets/compiled # sass 檔 和 css 檔 分開目錄, 這會把目前此目錄底下的 *.sass 檔, compile 完成後, 都放到 stylesheets/compiled/ 下面.
  • sass input.scss output.css # 直接 run 產生出 css 檔
  • sass –watch input.scss:output.css
  • sass –watch app/sass:public/stylesheets
  • sass –watch –style compressed style.scss:style.css

SASS語法

/* function */
@mixin rounded-top {
$side: top;
$radius: 10px;

border-#{$side}-radius: $radius;
-moz-border-radius-#{$side}: $radius;
-webkit-border-#{$side}-radius: $radius;
}

/* include  */
#navbar li { @include rounded-top; }
#footer { @include rounded-top; }

/* extend */
/* 原始內容 */
.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
border: 1px #f00;
background-color: #fdd;
border-width: 3px;
}
使用 extend, 可寫成下述:
.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}

/* Parent References */
/* 原始內容 */
a {
color: #ce4dd6;
&:hover { color: #ffb3ff; }
&:visited { color: #c458cb; }
}
Compile 
a:hover, a:visited ...

/* Arguments */
@mixin rounded($side, $radius: 10px) {
border-#{$side}-radius: $radius;
-moz-border-radius-#{$side}: $radius;
-webkit-border-#{$side}-radius: $radius;
width: $navbar - width / $items - 10px; # 可以做運算
}

#navbar li { @include rounded(top); }
#footer { @include rounded(top, 5px); }
#sidebar { @include rounded(left, 8px); }

/* 拉入另外一個scss檔案,scss 的檔名前面要有 "_" */
/* _rounded.scss => style.scss */
@import "rounded";

/* Interpolation 全域變數 */
/* 原始內容 */
$name: foo;
$attr: border;
p.#{$name} { #{$attr}-color: blue }
Compile 
p.foo { border-color: blue; }

sass 還有個好朋友 compass ,不過我目前沒有用到,以後有機會用到再來介紹它~

more

[ MySQL ] 資料表發生錯誤 marked as crashed 時的修復方法

logo

前幾天國慶假日的時候,假日的值班人員跟我說有幾個首頁突然進不去 ! 嚇得我趕快連回公司處理,原本以為是 httpd 掛了,但是就在我這麼以為的時候我卻進的去 phpMyAdmin ,也從phpMyAdmin的首頁發現mysqld掛掉,我先是重啟了mysqld,但還是發現有幾個table沒有反應 ! 點進去又發現 "tablename" is marked as crashed and should be repaired when using LOCK TABLES." 的錯誤訊息,就有了以下的解決方式。

當我點開那個故障的table時的錯誤訊息如下:

Table ‘xxxxx(table name)’ is marked as crashed and should be repaired

Function 1

直接進MySQL bashphpMyAdmin輸入指令

REPAIR TABLE ‘table name’

Function 2

連進phpMyAdmin後進入該table所在的DB,在表單的頁面中勾選需要修復的table,並在最下面選「修復資料表」即可

雖然解決方法非常簡單,但是遇到的時候還是很頭痛呢= =”

more