boto
を介して複数のAmazon Web Services(AWS)アカウントを管理する最良の方法は何ですか?
私が使用している BotoConfig ファイルに精通しています。しかし、各ファイルは単一のアカウントのみを記述しています...そして、私は複数の組織で作業しています。通常の法的、財政的、およびセキュリティ上の理由から、これらのアカウントを混ぜることはできません。
現在、アカウントごとに1つのboto
構成ファイルを使用しています。例えば。:
~/.boto
デフォルトのアカウント~/.boto_clowncollege
「クラウンカレッジ」アカウント用~/.boto_razorassoc
「razorassoc」アカウント~/.boto_xyz
「xyz」アカウント用その後、次のようなもの:
def boto_config_path(account=None):
"""
Given an account name, return the path to the corresponding boto
configuration file. If no account given, return the default config file.
"""
path = '~/.boto' + ('_' + account if account else '')
clean_path = os.path.abspath(os.path.expanduser(path))
if os.path.isfile(clean_path):
return clean_path
else:
errmsg = "cannot find boto config file {} for {}".format(clean_path, account)
raise ValueError(errmsg)
def aws_credentials(account=None):
"""
Return a Tuple of AWS credentials (access key id and secret access key) for
the given account.
"""
try:
cfg = INIConfig(open(boto_config_path(account)))
return ( cfg.Credentials.aws_access_key_id, cfg.Credentials.aws_secret_access_key )
except Exception:
raise
conn = EC2Connection(*aws_credentials('razorassoc'))
良い、悪い、または無関心ですか?改善の提案はありますか?
将来、botoは複数の資格情報の管理に役立つより良いツールを提供しますが、現時点では、役立つ可能性のある環境変数がいくつかあります。
最初に、使用するboto構成ファイルを指すようにBOTO_CONFIGを設定できます。これにより、通常の場所にある構成ファイルが上書きされます。
次に、BOTO_PATHをコロンで区切られた場所のリストに設定して、boto configファイルを検索すると、通常の検索場所の前に最初に検索されます。
どちらもあなたが望むものを正確に提供するわけではありませんが、少し少ないコードで簡単に達成できるかもしれません。
これをbotoでどのように動作させるかについてのアイデアがある場合は、お知らせください!
2015-02-06を更新、2015-03-19を修正
Boto 2.29以降、Mike Garnaatが AWS SDKの認証情報を管理するための新しい標準化された方法
目的は次のとおりです。
ファイル~/.aws/credentials
(Mac/Linux)または%USERPROFILE%\.aws\credentials
(Windwos)を次のように作成します。
[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1
[jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1
[hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
region = eu-west-1
これからは、次のようなコードを使用できます。
import boto
con = boto.connect_s3()
AWS_PROFILE
envで設定された明示的なプロファイルを使用します。 var(これは、プロファイル名をコードから外し、アプリケーションのデプロイヤに特定のプロファイルを選択する機会を与える私のお気に入りのオプションです)
$ export AWS_PROFILE=jekyl
そして、コードを以前と同じようにシンプルに保ちます。
import boto
con = boto.connect_s3()
import boto
con = boto.connect_s3(profile_name="jekyl")
これは、通常行う必要があるすべてです
適切な資格情報を選択するためのロジックは、次のように boto issue#2292 で説明されています。
優先順位が最高から最低へのロード順:
1.コードから直接渡される
キー/シークレットの環境変数
プロファイルの環境変数
共有資格情報ファイルの明示的プロファイル
共有資格情報ファイルのデフォルトプロファイル
構成ファイルの明示的プロファイル
構成ファイルの資格情報セクション
コードから渡されたプロファイルは、環境変数の設定をオーバーライドします。
物事を簡潔でシンプルに保つには、古いメソッドを削除するのが良いので、古いスタイルのファイル(~/.aws/config
や~/.boto
など)を削除し、設定されている場合はBOTO_CONFIG
を設定解除しますまた、そのような変数が指すファイル。
そして、これがboto> = 2.29.0のすべてです
注:env.variable(AWS_CONFIG_FILE
など)によって構成ファイルの場所を制御しようとしないでください。期待どおりに機能しません。
以下の説明は、boto 2.29.0以降にアップグレードできないユーザーのみを対象にしています
Boto 2.24.0以降、profile_name
という機能があります
~/.boto
ファイルには、既に[Credentials]セクションがあります。これはフォールバックオプションとして機能し、[profile]セクションは異なるプロファイルに対応します。
[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
次に、接続を作成するときに、次の方法を使用します。
import boto
con = boto.connect_s3(profile_name="jekyl")
この機能はboto 2.24.0以降で使用可能です。
チュートリアルはこちら http://docs.pythonboto.org/en/latest/boto_config_tut.html?highlight=profile
キーリングの使用に関する注意事項もありますが、最初にこのプロファイルに慣れるのは、数年前から夢見ていたことです。
AWSCLIは本当に素晴らしいツールになりました。構成ファイルの形式はほぼ同じなので、次のように使用します。
~/.aws/config
ファイルを保持します(これはデフォルトの場所です)[default]
をコピーし、名前を[Credentials]
に変更します(内部に同じ値を残します)。BOTO_CONFIG
ファイルを指すように~/.aws/config
変数を設定します。~/.boto
は、次の内容の `〜/ .aws/configになります。
[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
これにより、プロファイルを含むAWSCLIとbotoの両方で共有されます。
http://boto.cloudhackers.com/en/latest/boto_config_tut.html -connect_cloudwatch()を使用する場合botoバージョン2.48.0私は実際に提供する必要がありました
cloudwatch_region_endpoint
または、EC2でインスタンス自体からデータをプッシュする場合(インスタンスがプッシュ先とは異なるリージョンにある場合)、接続は現在のインスタンスと同じリージョンを使用します。
cat .boto
[Boto]
cloudwatch_region_name = us-west-2
cloudwatch_region_endpoint = monitoring.us-west-2.amazonaws.com
それを.aws/credentialsプロファイルに追加しようとしましたが、うまくいかないようでした。
cat .aws/credentials
[cloudwatch_centralized_reporting]
region = us-west-2
aws_access_key_id = XXX
aws_secret_access_key = XXX