ようへいの日々精進XP

よかろうもん

Python boto3 で認証情報を指定するメモ

ども、かっぱです。ぼちぼちやってます。

tl;dr

適切な IAM Role が適用されていない環境で boto3 を使う際に避けては通れない(はず)の認証情報を指定する方法をメモっておく。

尚、ソースコード内に認証情報を書くのはよろしく無いので、あくまでも検証、動作確認用途に限定しましょう。

参考

有難うございましたmm

memo

~/.aws/credentials

$ cat ~/.aws/credentials

[oreno-profile]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

ACCESS_KEY と SECRET_ACCESS_KEY を使う場合

import boto3

s3 = boto3.client('s3',
                  aws_access_key_id='xxxxxxxxxxxxxxxxxxxx',
                  aws_secret_access_key='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
                  region_name='ap-northeast-1')
print s3.list_buckets().__class__.__name__

もしくは...

from boto3.session import Session

session = Session(aws_access_key_id='xxxxxxxxxxxxxxxxxxxx',
                  aws_secret_access_key='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
                  region_name='ap-northeast-1')

s3 = session.client('s3')
print s3.list_buckets().__class__.__name__

profile 名を指定する場合

from boto3.session import Session

session = Session(profile_name='oreno-profile')
s3 = session.client('s3')
print s3.list_buckets().__class__.__name__

実行例

#
# ACCESS_KEY と SECRET_ACCESS_KEY をベタ書き(出来るだけ避けたい例)
#
$ python
Python 2.7.12 (default, Sep  3 2016, 08:17:12)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> import boto3
>>> s3 = boto3.client('s3',
...                   aws_access_key_id='xxxxxxxxxxxxxxxxxxxxx',
...                   aws_secret_access_key='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
...                   region_name='ap-northeast-1')
>>> print s3.list_buckets().__class__.__name__
dict

#
# 環境変数を利用する(苦肉の策)
#
$ AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxxx
$ AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
$ python
Python 2.7.12 (default, Sep  3 2016, 08:17:12)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import boto3
>>> import os
>>> s3 = boto3.client('s3',
...                   aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),
...                   aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY'),
...                   region_name='ap-northeast-1')
>>> print s3.list_buckets().__class__.__name__
dict

#
# session クラスを使って ACCESS_KEY と SECRET_ACCESS_KEY をベタ書き(出来るだけ避けたい例)
#
$ python
Python 2.7.12 (default, Sep  3 2016, 08:17:12)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> from boto3.session import Session
>>>
>>> session = Session(aws_access_key_id='xxxxxxxxxxxxxxxxxxxxx',
...                   aws_secret_access_key='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy',
...                   region_name='ap-northeast-1')
>>> s3 = session.client('s3')
>>> print s3.list_buckets().__class__.__name__
dict

#
# session クラスを使って ~/.aws/credentials の profile 名を指定する例
#
$ python
Python 2.7.12 (default, Sep  3 2016, 08:17:12)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> from boto3.session import Session
>>> session = Session(profile_name='oreno-profile')
>>> s3 = session.client('s3')
>>> print s3.list_buckets().__class__.__name__
dict

以上

メモでした。

Amazon ECR から docker pull する為に最低限必要な手順

tl;dr

整理した。

大前提

  • 最低でも IAM Policy の AmazonEC2ContainerRegistryReadOnly をつけた IAM Role 又は IAM User を使う

EC2 上での手順

前提

  • EC2 には 管理ポリシーの AmazonEC2ContainerRegistryReadOnly をつけた IAM Role が付いている

手順

  • docker login コマンドを取得する
aws --region ap-northeast-1 ecr get-login
  • docker login する
docker login -u AWS -p xxxxxxxxxxxxxxxx -e none https://0000000000000.dkr.ecr.ap-northeast-1.amazonaws.com
  • docker pull する
docker pull 0000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/oreno-image

EC2 以外の環境での手順

前提

  • 管理ポリシーの AmazonEC2ContainerRegistryReadOnly をつけた IAM User を作成
  • IAM User の認証情報(アクセスキー、シークレットアクセスキー)を発行しておいて ~/.aws/credentials に登録しておく

手順

  • docker login コマンドを取得する
aws --profile oreno-profile --region ap-northeast-1 ecr get-login
  • docker login する
docker login -u AWS -p xxxxxxxxxxxxxxxx -e none https://0000000000000.dkr.ecr.ap-northeast-1.amazonaws.com
  • docker pull する
docker pull 0000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/oreno-image

以上

メモでした。

PowerShell で操作する Azure メモ(2)

ども、かっぱです。

tl;dr

引続き、PowerShell で Azure を操作するメモ。

操作する環境は以下の通り。

PS C:\Users\Administrator\Downloads> [System.Environment]::OSVersion

                          Platform ServicePack                        Version                            VersionString
                          -------- -----------                        -------                            -------------
                           Win32NT                                    6.3.9600.0                         Microsoft Windows NT 6.3.9600.0

PS C:\Users\Administrator\Downloads> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2

参考

仮想ネットワークを作って、その中に仮想マシンを作る

要件

  • 仮想ネットワーク(クラシック)を作成(サブネットは 2 つ)
  • パラメータを指定して仮想マシンを作成する(OS は Windows Server 2012 R2)
  • 仮想マシン(クラシック)は New-AzureVM コマンドを利用して作成する
  • 作成した VM にアクセスしてみる

仮想ネットワークの作成

  • 既存の設定を書き出す(事前に仮想ネットワークを 1 つ作っておく)
Get-AzureVNetConfig -ExportToFile C:\Users\Administrator\Documents\NetworkConfig.xml
  • ouput
XMLConfiguration              OperationDescription          OperationId                   OperationStatus
----------------              --------------------          -----------                   ---------------
<?xml version="1.0" encodi... Get-AzureVNetConfig           xxxxxxxx-xxxx-xxxx-xxxx-a2... Succeeded
  • 確認
PS C:\Users\Administrator\Documents> cat NetworkConfig.xml
<?xml version="1.0" encoding="utf-8"?>
<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
  <VirtualNetworkConfiguration>
    <Dns />
    <VirtualNetworkSites>
      <VirtualNetworkSite name="Group your-service01 TestVNet01" Location="Japan West">
        <AddressSpace>
          <AddressPrefix>192.168.0.0/16</AddressPrefix>
        </AddressSpace>
        <Subnets>
          <Subnet name="FrontEnd">
            <AddressPrefix>192.168.1.0/24</AddressPrefix>
          </Subnet>
        </Subnets>
      </VirtualNetworkSite>
    </VirtualNetworkSites>
  </VirtualNetworkConfiguration>
</NetworkConfiguration>
  • 編集、確認(サブネット BackendEnd を一つ追加してみた)
PS C:\Users\Administrator\Documents> cat NetworkConfig.xml
<?xml version="1.0" encoding="utf-8"?>
<NetworkConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/ServiceHosting/2011/07/NetworkConfiguration">
  <VirtualNetworkConfiguration>
    <Dns />
    <VirtualNetworkSites>
      <VirtualNetworkSite name="Group your-service01 TestVNet01" Location="Japan West">
        <AddressSpace>
          <AddressPrefix>192.168.0.0/16</AddressPrefix>
        </AddressSpace>
        <Subnets>
          <Subnet name="FrontEnd">
            <AddressPrefix>192.168.1.0/24</AddressPrefix>
          </Subnet>
          <Subnet name="BackendEnd">
            <AddressPrefix>192.168.2.0/24</AddressPrefix>
          </Subnet>
        </Subnets>
      </VirtualNetworkSite>
    </VirtualNetworkSites>
  </VirtualNetworkConfiguration>
</NetworkConfiguration>
  • 適用
Set-AzureVNetConfig -ConfigurationPath C:\Users\Administrator\Documents\NetworkConfig.xml
  • ouput
OperationDescription                    OperationId                             OperationStatus
--------------------                    -----------                             ---------------
Set-AzureVNetConfig                     xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    Succeeded
  • 確認
Get-AzureVNetSite -VNetName "Group your-service01 TestVNet01"
  • ouput
AddressSpacePrefixes : {192.168.0.0/16}
Location             : Japan West
AffinityGroup        :
DnsServers           : {}
GatewayProfile       :
GatewaySites         :
Id                   : 123456789-1234-5678-9000-12345678912
InUse                : False
Label                :
MigrationState       :
Name                 : Group your-service01 TestVNet01
State                : Created
Subnets              : {FrontEnd, BackendEnd}
OperationDescription : Get-AzureVNetSite
OperationId          : xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
OperationStatus      : Succeeded

VM 作成

  • New-AzureVMConfigVM の設定を定義して New-AzureVMVM を作成
$_locationName  = "Japan West"
$_vmName        = "vm01"
#
# Get-AzureVMImage を実行して Windows Server 2012 R2 datacenter の VM イメージの ImageName を取得
# 
$_imageName     = @(Get-AzureVMImage | ? {$_.OS -eq "Windows" -and $_.ImageFamily -eq "Windows Server 2012 R2 datacenter"} ` | Sort-Object PublishedDate –Descending | Select-Object -First 1 ).ImageName
$_adminUser     = "oreadmin"
$_adminPassword = "YourPassword!01"
$_cloudService  = "your-service01"
#
# Get-AzureVNetSite を実行して仮想ネットワーク名を取得
#
$_vnetName      = @(Get-AzureVNetSite -VNetName "Group your-service01 TestVNet01").Name
$_subNet        = "FrontEnd"

#
# New-AzureVMConfig ...インスタンスサイズ、イメージ名等を設定
# Add-AzureProvisioningConfig ... ログインユーザー名、パスワード等の OS より上のレイヤーを設定(-EnableWinRMHttp で HTTP 経由での WinRM の操作を有効にしている)
# Set-AzureVMBGInfoExtension ... VM エージェントをインストールする
# Set-AzureSubnet ... 仮想ネットワーク内に作成したサブネットを設定
#
$_vmConfig = `
New-AzureVMConfig -Name $_vmName -InstanceSize Small -ImageName $_imageName `
| Add-AzureProvisioningConfig -Windows -AdminUsername $_adminUser -Password $_adminPassword -EnableWinRMHttp `
| Set-AzureVMBGInfoExtension `
| Set-AzureSubnet -SubnetNames $_subNet `
| New-AzureVM -ServiceName "your-service01" -VNetName $_vnetName -Location "Japan West" -WaitForBoot

VM にアクセスする為に必要な情報を確認する

  • Get-AzureEndpoint を実行して Virtual IP とポート等を確認する
Get-AzureVM -ServiceName $_cloudService -Name $_vmName  | Get-AzureEndpoint | Select Name,Port,Vip
  • output
Name                                                                       Port Vip
----                                                                       ---- ---
PowerShell                                                                63829 xxx.xxx.xxx.xxx
RemoteDesktop                                                             50698 xxx.xxx.xxx.xxx

幾つかの方法で VM にアクセスする

$_username      = "oreadmin"
$_passwd        = "YourPassword!01"
$_secure_string = ConvertTo-SecureString $_passwd -AsPlainText -Force
$_pscredential  = New-Object System.Management.Automation.PsCredential($_username, $_secure_string)
$_cloudService  = "your-service01"
$_vmName        = "vm01"
$_uri = Get-AzureWinRMUri -ServiceName $_cloudService -Name $_vmName

#
# Enter-PSSession でインタラクティブに WinRM にアクセス
#
PS C:\Users\Administrator> Enter-PSSession -ConnectionUri $_uri -Credential $_pscredential -SessionOption (New-PSSessionOption -SkipCACheck)
[your-service01.cloudapp.net]: PS C:\Users\oreadmin\Documents> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      4.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.42000
BuildVersion                   6.3.9600.17400
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion      2.2


[your-service01.cloudapp.net]: PS C:\Users\oreadmin\Documents>

こちらの記事を参考にさせて頂いた。有難うございました。

#
# PowerShell を使って WinRM のエンドポイントを確認
# 
PS C:\Users\Administrator> Get-AzureWinRMUri -ServiceName $_cloudService -Name $_vmName  | select AbsoluteUri

AbsoluteUri
-----------
https://your-service01.cloudapp.net:63829/

AbsoluteUri を控えておいて...(事前に pip install pywinrm しておく必要がある)

$ python
Python 2.7.12 (default, Sep  3 2016, 08:17:12)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import winrm
>>> s = winrm.Session('https://your-service01.cloudapp.net:63829/wsman', auth=('oreadmin', 'YourPassword!01'), server_cert_validation='ignore', transport='ntlm')
>>> r = s.run_cmd('ipconfig', ['/all'])
>>> r.status_code
0
>>> r = s.run_cmd('powershell -Command $PSVersionTable')
>>> r.status_code
0

WinRM 経由で ifconfig /allpowershell -Command $PSVersionTable を実行している。

後片付け

Remove-AzureVM -ServiceName your-service01 -Name vm01
  • output
OperationDescription                    OperationId                             OperationStatus
--------------------                    -----------                             ---------------
Remove-AzureVM                          xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    Succeeded
  • リソースグループの削除
#
# リソースグループ名を確認
#
Get-AzureRmResourceGroup | select ResourceGroupName
  • output
ResourceGroupName
-----------------
Default-Storage-JapanWest
your-service01
TestRG
  • your-service01 グループを削除
#
# your-service01 グループを削除
#
Remove-AzureRmResourceGroup -Name your-service01
  • output
確認
Are you sure you want to remove resource group 'your-service01'
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): Y

(...暫く時間を置いて...)

True

リソースグループの削除に合わせて仮想ネットワークも削除される。

以上

メモでした。