Amazon Linux 2環境上にGCPコマンドラインツール・Google Cloud SDK動作環境を整える

2020.03.11

直近、業務にてAWSとGCPを合わせて利活用するケースがあり、各種挙動を確認する必要性があったので、その際に整えた環境の構築手順を備忘録として残しておきたいと思います。

目次

環境概要

差し当たって揃えた環境やライブラリは以下の通り。

  • Amazon Linux 2
  • Python 3.7.6
  • AWS CLI v2
  • GCPのコマンドラインツール
  • Google Cloud SDK(Python)

導入環境の準備

今回揃える環境として、Amazon Linux 2を用いました。

# ssh -i cm-gcp-xxxxxx.pem ec2-user@xx.xxx.xxx.xx
$ sudo yum -y update
$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

Pythonの初期設定時バージョンは導入済のもので2.7系。これを3.x系にアップグレードしておきます。

$ python --version
Python 2.7.16

pyenvのインストール

Pythonバージョン環境切替のソリューションについては現在様々なものが出ていますが、今回は3.xに切り替えられれば良いや、位のノリなのでここではpyenvで対応。

## gitの導入(何やかんやで使うので合わせてjqも入れてる)
$ sudo yum -y install git jq
$ git --version

## git cloneコマンドで必要な情報を入手
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
Cloning into '/home/ec2-user/.pyenv'...
remote: Enumerating objects: 17608, done.
remote: Total 17608 (delta 0), reused 0 (delta 0), pack-reused 17608
Receiving objects: 100% (17608/17608), 3.47 MiB | 22.62 MiB/s, done.
Resolving deltas: 100% (11960/11960), done.

## 環境変数設定
$ vi ~/.bashrc
# 下記の内容を末尾に追記
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
  export PATH=${PYENV_ROOT}/bin:$PATH
  eval "$(pyenv init -)"
fi

$ source ~/.bashrc

## 導入完了確認
$ pyenv --version
pyenv 1.2.16-5-g7097f820

Python 3.x系環境をインストール

導入可能な環境の一覧を確認。ここではPython3.x系の中で3.7.6を導入する事にしました。

所定バージョンのインストールに際しては諸々必要なライブラリがありますので、前もってyumコマンドで導入しておきます。導入が完了したらpyenv install (バージョン番号)でインストール実施。

$ pyenv install --list
$ sudo yum -y install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel
$ pyenv install 3.7.6
Downloading Python-3.7.6.tar.xz...
-> https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz
Installing Python-3.7.6...
Installed Python-3.7.6 to /home/ec2-user/.pyenv/versions/3.7.6

バージョンの切替を行い、変わったことを確認出来ていればOK。

## バージョン切替.
$ pyenv global 3.7.6
$ pyenv rehash

## バージョンが切り替わったことを確認.
$ pyenv versions
  system
* 3.7.6 (set by /home/ec2-user/.pyenv/version)

## pythonのコマンドでも確認.
$ python --version
Python 3.7.6

AWS: AWS CLI(v2)のインストール

現状、AWS CLIは従来使えていたv1系のものと、先日一般利用可能となったv2系が存在します。ここでは、せっかくなのでv2系を使ってみたいと思います。

手順としては以下3ステップを実行するだけ。予めPythonの環境を用意・考慮しておく必要が無い(You no longer need to install and maintain Python to use the AWS CLI.)というのが嬉しい所ですね。(今回の環境ではPythonプログラムを実行したいのもあったので個別にPython環境は用意しましたが)

$ curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install

コマンドインストール後のバージョン確認。導入したバージョン(v3.7.6)とは異なる独立したバージョンのものが導入されていました。

$ aws --version
aws-cli/2.0.0 Python/3.7.3 Linux/4.14.154-128.181.amzn2.x86_64 botocore/2.0.0dev4

GCP: Google Cloud SDKのインストール

ライブラリインストールに伴い、必要なリポジトリと連携する為に設定ファイルを別途作成しておきます。

$ sudo tee -a /etc/yum.repos.d/google-cloud-sdk.repo << EOM
[google-cloud-sdk]
name=Google Cloud SDK
baseurl=https://packages.cloud.google.com/yum/repos/cloud-sdk-el7-x86_64
enabled=1
##gpgcheck=1
##repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOM

上記設定後、yumコマンドで必要なライブラリをインストール。gcloud --versionでバージョンを確認する事が可能です。この手順ではgsutilの他にもbq(BigQuery)やkubectl(Kubernetes)のコマンドラインツールなども合わせて導入されます。

$ sudo yum -y install google-cloud-sdk
$ gcloud --version
Google Cloud SDK 279.0.0
alpha 2020.01.31
beta 2020.01.31
bq 2.0.53
core 2020.01.31
gsutil 4.47
kubectl 2020.01.31

GCP: サービスアカウントのアクティベーション

この環境では、Google Cloud SDKを利用するための認証を「サービスアカウントキー認証」によって行います。サービスアカウントキーの作成については下記エントリをご参照ください。

作成したサービスアカウントキーを当該環境の所定のパスに保存。

$ pwd
/home/ec2-user
$ ls
gcp-service-account-key.json

gcloud auth activate-service-accountコマンドで認証処理実行。

## 1つ目の引数:認証に用いるサービスアカウントのアドレス
## 2つ目の引数(--key-file):配備したサービスアカウントキーのフルパス
## 3つめ目引数(--project):認証対象のプロジェクト名
$ gcloud auth activate-service-account \
    xxxxxxxxxxxxxxx@yyyyyyy.iam.gserviceaccount.com  \
    --key-file /home/ec2-user/gcp-service-account-key.json \
    --project cm-da-xxxxxxxx
Activated service account credentials for: [xxxxxxxxxxxxxxx@yyyyyyy.iam.gserviceaccount.com]

以下の形式でプロジェクトの一覧が表示されていれば認証完了です。

$ gcloud projects list
PROJECT_ID        NAME              PROJECT_NUMBER
cm-da-xxxxxxxxxx  cm-da-xxxxxxxxxx  123456789123

GCP: サービスアカウント利用に際して認証情報を設定

サービスアカウントを使用する場合、予め認証情報を設定しておく必要があります。

環境変数GOOGLE_APPLICATION_CREDENTIALSにサービスアカウントキーの配置パスを設定することで、この対応が行えます。

## 末尾に追記(フルパス、実際に配置したパスを設定)
$ vi ~/.bash_profile
----
export GOOGLE_APPLICATION_CREDENTIALS=/home/ec2-user/gcp-service-account-key.json
----
$ source ~/.bash_profile

## 内容を確認、設定したパスが表示されていればOK
$ echo $GOOGLE_APPLICATION_CREDENTIALS

GCP: 各種サービスの連携をサンプルコードで確認

上記までの手順で初期設定は完了です。実際にプログラムが稼働するかどうか、試してみましょう。

Google Cloud Storage

任意のGoogle Cloud Storageバケットが1つ以上存在している状態で、そのバケット一覧が取得出来るかどうか試します。

CLIで確認
$ gsutil ls
gs://s31b/
gs://shinyaa31-gcs-bucket/
Google Cloud SDK(Python)で確認

関連ライブラリのインストール:

$ pip3 install --upgrade google-cloud-storage

Pythonプログラムを用意]:

list-gcs-buckets.py

from google.cloud import storage

# If you don't specify credentials when constructing the client, the
# client library will look for credentials in the environment.
storage_client = storage.Client()

# Make an authenticated API request
buckets = list(storage_client.list_buckets())
print(buckets)

Pythonプログラム実行:

$ python list-gcs-buckets.py
[<Bucket: shinyaa31-gcs-bucket-1>, <Bucket: shinyaa31-gcs-bucket-2>, <Bucket: shinyaa31-gcs-bucket-3>]

Google BigQuery

CLIで確認
$ bq ls
       datasetId        
 ----------------------
  cmdataset             
  shinyaa31_bq_dataset  

Google Cloud SDK(Python)で確認

関連ライブラリのインストール:

$ pip3 install --upgrade google-cloud-bigquery

Pythonプログラムを用意]:

list-bq-datasets.py

# TODO(developer): Import the client library.
from google.cloud import bigquery

# TODO(developer): Construct a BigQuery client object.
client = bigquery.Client()

datasets = list(client.list_datasets())  # Make an API request.
project = client.project

if datasets:
    print("Datasets in project {}:".format(project))
    for dataset in datasets:
        print("\t{}".format(dataset.dataset_id))
else:
    print("{} project does not contain any datasets.".format(project))

Pythonプログラム実行:

$ python list-bq-datasets.py
Datasets in project cm-xxxxxxxxxxx:
	cmdataset
	shinyaa31_bq_dataset

まとめ

という訳で、Amazon Linux 2上にGCPのプログラム動作検証を行う手順のまとめ紹介でした。

今後必要なセットアップ、ライブラリは増えてくると思いますのでその際は適宜このエントリに追記していこうと思います。