AnsibleでAWS S3にファイルを登録してみる
★ この記事は3年前に執筆し、投稿し忘れていたものを投稿したものです
背景
お仕事でローカルファイルをAWS S3にアップロードする要件がありました。
AWS CLIでは何度もやってますが、今回はAnsibleから行うのが要件の一つにありましたので試してみることにします。
参考
・Amazon AWS Collection
・amazon.aws.aws_s3 – manage objects in S3.
どうやればできる?
調べてみると、Ansibleには「amazon.aws」モジュールが存在していました。
こちらのモジュールを使えばAWSの各サービスにアクセス可能のようです。
今回はS3への登録が目的なので、「aws_s3」モジュールを使ってみます。
また、使用に際してBoto3も必要なのでインストールします。
なお、今回は事前にaws configureを実行し、ansible実行環境でaws cliが利用可能な準備が整っていることを前提とします。
検証ファイル構成
.
├── inventory
├── playbook.yml
├── readme.md
└── work
└── sample.tgz
インベントリファイル
今回はお試しなのでlocalhost、自サーバをターゲットとします。
./inventory
xxx.xxx.xxx.xxx
プレイブック
動作確認もかねて、pingモジュールを最初に実行したあと、aws_s3モジュールを実行します。
./playbook.yml
- hosts: all
tasks:
- name: ping
ping:
register: result
- name: Simple PUT operation
amazon.aws.aws_s3:
bucket: xxxxxxxxxx
object: /aaa/sample-s3.txt
src: /home/xxxxx/job/ansible/aws-s3/work/sample.txt
mode: put
モジュールのインストール
実行に必要な「amazon.aws」モジュールをインストールします。
$ ansible-galaxy collection install amazon.aws
Process install dependency map
Starting collection install process
Installing 'amazon.aws:1.5.0' to '/home/xxxxx/.ansible/collections/ansible_collections/amazon/aws'
続いて、aws cli、botoをインストールします。
$ sudo apt install awscli
$ sudo apt install python-pip
$ sudo pip install boto boto3
aws接続初期設定
$ aws configure
AWS Access Key ID [None]: xxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: us-west-2
Default output format [None]: json
動作確認としてS3バケットの一覧を取得してみます
$ aws s3 ls
正常にバケット一覧が取得できたので実際にansibleを動かします。
$ ansible-playbook --ask-pass -i inventory playbook.yml
マネジメントコンソールにログインし、指定したバケットにファイルが登録されていることが確認できました。
おわりに
今回はplaybookの中にアクセスキーやシークレットアクセスキーを記述するのが嫌だったので、予めaws configureを実行しておく方法を取りましたが、playbookの中に記述することも可能です。
- name: Simple PUT operation
amazon.aws.aws_s3:
aws_access_key: xxxxxxxxxx
aws_secret_key: xxxxxxxxxx
region: us-west-2
bucket: xxxxxxxxxx
object: /aaa/sample-s3.txt
src: /home/xxxxx/job/ansible/aws-s3/work/sample.txt
mode: put
また、予めs3のバケットとフォルダは作成しておく必要がありますので、今回は既存のS3を使用しました。
ちなみに、バケットがあってもフォルダがなければ処理は正常に終わるがputされていませんでした。
前に検証したarchiveモジュールと組み合わせ、ローカルのファイルを圧縮して、そのファイルをS3に保存するという流れもできそうです。
お試しでAWSを触るならマネジメントコンソールにログインしGUI操作がわかりやすくて良いですが、これからIaCやCI/CDを学ぶなら、GUI操作ばかりでなく、こういったAnsibleで構築するもの良いと思います。
ただ、playbookに指定するパラメータはGUIで予め確認しておくと理解も深まると思います。