- Sử dụng 1 tài khoản
- Nhiều tài khoản bằng biến môi trường
- Nhiều tài khoản theo environment và scope biến môi trường theo environment
- Nhiều tài khoản bằng AWS Profile
Sử dụng 1 tài khoản
Để bắt đầu, chúng ta sử dụng 1 tài khoản để upload lên S3, chúng ta sẽ khai báo các biến môi trường sau bên trong Gitlab CI
AWS_S3_BUCKET
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_DEFAULT_REGION
File pipeline .gitlab-ci.yml
stages:
- build
- production
create file:
stage: build
image: alpine
script:
- touch foo.bar
artifacts:
paths:
- foo.bar
deploy to production:
stage: production
image:
name: amazon/aws-cli
entrypoint: [""]
script:
- aws --version
- aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
Theo mặc định các biến AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
, AWS_DEFAULT_REGION
sẽ được AWS CLI sử dụng để authen, không cần khai báo gì thêm
Nhiều tài khoản bằng biến môi trường
Cách này không phải hay nhất nhưng đa phần chúng ta sẽ nghĩ ngay tới đó là đặt hàng loạt biến AWS khác nhau cho từng môi trường
Bên trong job, chúng ta sẽ lấy các biến môi trường này ra để sử dụng, khá "thủ công"
stages:
- build
- test
- production
create file:
stage: build
image: alpine
script:
- touch foo.bar
artifacts:
paths:
- foo.bar
deploy to test:
stage: test
image:
name: amazon/aws-cli
entrypoint: [""]
before_script:
# Set lại giá trị credential
- export AWS_ACCESS_KEY_ID=$TEST_AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$TEST_AWS_SECRET_ACCESS_KEY
- export AWS_DEFAULT_REGION=$TEST_AWS_DEFAULT_REGION
script:
- aws --version
- aws s3 cp foo.bar s3://$TEST_AWS_S3_BUCKET/foo.txt
deploy to production:
stage: production
image:
name: amazon/aws-cli
entrypoint: [""]
before_script:
# Set lại giá trị credential
- export AWS_ACCESS_KEY_ID=$PROD_AWS_ACCESS_KEY_ID
- export AWS_SECRET_ACCESS_KEY=$PROD_AWS_SECRET_ACCESS_KEY
- export AWS_DEFAULT_REGION=$PROD_AWS_DEFAULT_REGION
script:
- aws --version
- aws s3 cp foo.bar s3://$PROD_AWS_S3_BUCKET/foo.txt
Cách này nhìn chung là dễ hiểu, dễ làm, tuy nhiên nó lại phải khai báo khá nhiều biến bên trong pipeline và quá nhiều config trên từng job
Nhiều tài khoản theo environment và scope biến môi trường theo environment
Nếu bạn để ý bên trong phần khai báo biến môi trường, chúng ta có cột Environment, có nghĩa là biến có thể có scope theo từng môi trường được
Chúng ta cần khai báo thêm environment cho job để nó có thể sử dụng biến môi trường thuộc scope
deploy to test:
stage: test
...
environment:
name: testdeploy to production:
stage: production
...
environment:
name: production
Sau khi khai báo thêm biến môi trường cho job, bên trong màn hình thêm variables lúc này chúng ta sẽ có thêm các lựa chọn ngoài All như trước
Bây giờ chúng ta chỉ cần bỏ đi prefix, đặt lại đúng tên và môi trường là xong
stages:
- build
- test
- production
create file:
stage: build
image: alpine
script:
- touch foo.bar
artifacts:
paths:
- foo.bar
deploy to test:
stage: test
image:
name: amazon/aws-cli
entrypoint: [""]
script:
- aws --version
- aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
environment:
name: test
deploy to production:
stage: production
image:
name: amazon/aws-cli
entrypoint: [""]
script:
- aws --version
- aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
environment:
name: production
Như có thể thấy, pipeline giờ gần giống như trường hợp chúng ta chỉ có 1 tài khoản, rất dễ hiểu dễ làm, không cần thêm config gì rườm rà trên file .gitlab-ci.yml
, tuy nhiên nó vẫn có quá nhiều biến môi trường cần phải quản lý
Nhiều tài khoản bằng AWS Profile
Bên trong Gitlab, variables không chỉ có thể là giá trị, nó còn có thể là file, chúng ta khai báo các credentials theo dạng file
Một file credentials của aws sẽ có dạng ~/.aws/credentials
[production]
aws_access_key_id=AKIAXKYMDEKGYDJ2OT4U
aws_secret_access_key=N/T3ZafKprWt3EMnMFDQCXXXXXXXXXXXXX
region=us-east-1
[test]
aws_access_key_id=AKIA6C7LEVAXLETXGONN
aws_secret_access_key=wtilH45rB3oUyIjJnIALhOhLlyXXXXXXXXXXXXX
region=us-east-1
Khai báo biến AWS_SHARED_CREDENTIALS_FILE
dạng file
Biến AWS_SHARED_CREDENTIALS_FILE
lúc này sẽ chứa đường dẫn đến đến file
AWS CLI một cách thần kỳ sẽ hiểu dùng file này để lấy thông tin credential, job chúng ta chỉ cần chỉ định biến AWS_PROFILE
muốn sử dụng
stages:
- build
- test
- production
create file:
stage: build
image: alpine
script:
- touch foo.bar
artifacts:
paths:
- foo.bar
deploy to test:
stage: test
image:
name: amazon/aws-cli
entrypoint: [""]
variables:
## chỉ định profile test
AWS_PROFILE: test
script:
- aws --version
- aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
environment:
name: test
deploy to production:
stage: production
image:
name: amazon/aws-cli
entrypoint: [""]
variables:
# chỉ định profile production
AWS_PROFILE: production
script:
- aws --version
- aws s3 cp foo.bar s3://$AWS_S3_BUCKET/foo.txt
environment:
name: production
Và nếu thích dùng môi trường thay vì biến, chúng ta khai báo thêm biến môi trường để map vào từng profile, tuy nhiên mình thấy nó thêm rườm rà, khuyên bạn không nên.
Chúc các bạn thực vui!
GitLab CI: How to Manage AWS CLI Credentials for multiple AWS Accounts in a Single Pipeline Markdown selection 7246 bytes 840 words 249 lines Ln 250, Col 239HTML 4358 characters 807 words 173 paragraphs
Initializing...